Android网络数据解析之Gson
来源:互联网 发布:我的世界mac版懒人包 编辑:程序博客网 时间:2024/06/06 12:35
Android网络数据解析之Gson
一、Gson解析框架
Gson由谷歌研发,可以把Java对象转成Json,也可以把Json字符串转换成一个相等的Java对象。Gson支持任意复杂Java对象包括没有源代码的对象。
注:
Gson序列化的时候,如果对象的某个字段为null,是不会输出到Json中的。
Gson反序列化的时候,如果某个字段在Json中找不到对应的值,就会被赋值为null。
不会被序列化和反序列化字段:transient、synthetic、内部类的某个字段和外部类的某个字段一样。
二、Gson基本用法
在build.gradle中配置:compile ‘com.google.code.gson:gson:2.4’
Gson提供了fromJson()和toJson()两个直接用于解析和生成的方法,fromJson()实现反序列化,toJson()实现序列化。同时每个方法都提供了重载方法。
1. 基本数据类型的解析
Gson gson =new Gson();
//基本数据类型的解析
int i = gson.fromJson("100",int.class);
double d = gson.fromJson("99.99",double.class);//99.99字符串
double ds = gson.fromJson("\"99.99\"",double.class);//“99.99”字符串
boolean b = gson.fromJson("true",boolean.class);
String str = gson.fromJson("string",String.class);
Log.e("LKing","int = "+i);//结果:100
Log.e("LKing","double = "+d);//结果:99.99
Log.e("LKing","doubles = "+ds);//结果:99.99
Log.e("LKing","boolean = "+b);//结果:true
Log.e("LKing","string = "+str);//结果:string
注:double:不论99.99还是“99.99”,都会解析成double类型的99.99
2. 基本数据类型的生成
String jsonInt = gson.toJson(100);
String jsonDouble = gson.toJson(99.99);
String jsonBoolean = gson.toJson(true);
String jsonString = gson.toJson("string");
Log.e("LKing","jsonInt = "+jsonInt);//结果:100
Log.e("LKing","jsonDouble = "+jsonDouble);//结果:99.99
Log.e("LKing","jsonBoolean = "+jsonBoolean);//结果:true
Log.e("LKing","jsonString = "+jsonString);//结果:string
3. POJO类的生成与解析
POJO类:成员变量名就是Json的key值
public classTestPerson {
privateString name;
private int age;
publicTestPerson(String name,int age) {
this.name= name;
this.age= age;
}
public voidsetName(String name) {
this.name= name;
}
publicString getName() {
return name;
}
public voidsetAge(intage) {
this.age= age;
}
public intgetAge() {
return age;
}
}
生成JSON
//POJO数据类型的生成
TestPerson testPerson = new TestPerson("张三",20);
String jsonObject = gson.toJson(testPerson);
Log.e("LKing","jsonObject = "+jsonObject);
//结果:{"age":20,"name":"张三"}
解析JSON
//POJO数据类型的解析
TestPerson test = gson.fromJson(jsonObject,TestPerson.class);
String name = test.getName();
int age = test.getAge();
Log.e("LKing","name = "+name);//结果:张三
Log.e("LKing","age = "+age);//结果:20
4. 属性重命名@SerializedName
Json数据命名习惯不同
1)期望Json
{"name":"张三","age":20,"emailAddress":"1599863094@qq.com"}
2)实际Json
{"name":"张三","age":20,"email_address":"1599863094@qq.com"}
如何兼容两种不同的命名习惯?在POJO类中
@SerializedName("email_address")
public String emailAddress;
Json数据命名习惯不同,多种key命名
1)期望Json
{"name":"张三","age":20,"emailAddress":"1599863094@qq.com"}
2)实际第一种Json
{"name":"张三","age":20,"email_address":"1599863094@qq.com"}
3)实际第二种Json
{"name":"张三","age":20,"email":"1599863094@qq.com"}
如何兼容上面多种key命名:alternate接收一个String数组
@SerializedName(value = "email_address",alternate = {"email_address","email"})
public String emailAddress;
当上面的key(emailAddress、email_address、email)出现任何一个时都可以获取其对应的value值,当多种情况同时出现,以最后一个出现的值为准,如下
{"name":"张三","age":20,"emailAddress":"001@qq.com","email_address":"002@qq.com","email":"003@qq.com"}
获取的结果:emailAddress = 003@qq.com;
5. 数组两种解析方式
1)使用数组解析
Gson gson =new Gson();
String jsonArray ="[\"Android\",\"Java\",\"PHP\"]";
String[] strings = gson.fromJson(jsonArray, String[].class);
for (inti=0;i<3;i++){
Log.e("LKing","str = "+strings[i]);//结果:Android、Java、PHP
}
JSON字符串数组,使用List解析,直接将String[].class改为List<String>.class是不行的。对于Java来说List<String>和List<TestPerson>这两个字节码文件都是List.class,这是Java泛型使用时要注意的“泛型擦除”。
当我们希望将Json字符串数组使用List<String>解析(List对于增删都是比较方便)
2)使用List解析
Gson gson =new Gson();
String jsonArray ="[\"Android\",\"Java\",\"PHP\"]";
List<String> stringList =
gson.fromJson(jsonArray,new TypeToken<List<String>>() {}.getType());
Log.e("LKing","str = "+stringList.toString());//结果:[Android,Java,PHP]
注:TypeToken的构造方法是protected修饰的,所以上面才会写成
new TypeToken<List<String>>(){}.getType
而不是new TypeToken<List<String>>().getType
- Android网络数据解析之Gson
- android studio插件快速开发之gson解析网络数据
- Android解析Json数据之Gson解析
- 网络数据gson解析
- Android网络之数据解析----使用Google Gson解析Json数据
- Android网络之数据解析----使用Google Gson解析Json数据
- Android网络之数据解析----使用Google Gson解析Json数据
- Android之使用GSON解析JSON数据
- Android开发之Gson解析json数据
- Android数据解析JSON解析之GSON解析
- Android网络通讯——JSON,GSON解析网络数据
- Android中网络获取数据进行Gson解析
- android之gson解析
- Android 之 Gson 解析
- Json数据之Gson解析
- android 变长数据GSON解析
- Android解析json数据(Gson)
- Android Gson解析JSON数据
- netty搭建
- 指纹识别
- XSS 与 CSRF 两种跨站攻击
- LNMP 1.4一键安装包,安装教程
- 关于oracle的那些坑(c3p0连接池死锁 APPARENT DEADLOCK,druid没有反应,然后pl/sql登陆很慢,之后正常)
- Android网络数据解析之Gson
- mui app自定义图标
- jQueryday07(图片导航 两侧滚动条跟随 bind绑定事件可以只触发一次)
- 高复用率的RTSPClient组件EasyRTSPClient设计流程概述
- bzoj1641 [Usaco2007 Nov]Cow Hurdles 奶牛跨栏(Floyd)
- c下的strcmp函数的参考代码mystrcmp
- oracle 创建表的规则
- 【物联网】 ESP8266 Ubuntu开发环境的搭建
- 利用 Python 练习数据挖掘