频道栏目
首页 > 程序开发 > 移动开发 > Android > 正文
Android网络数据解析之Gson
2017-09-13 10:37:00      个评论    来源:LKing的博客  
收藏   我要投稿

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 class TestPerson {
private String name;
private int age;
public TestPerson(String name, int age) {
this.name = name;
this.age = age;
}

public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setAge(int age) {
this.age = age;
}

public int getAge() {
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 (int i=0;i<3;i++){
Log.e("LKing","str = "+strings[i]);//结果:Android、Java、PHP
}

JSON字符串数组,使用List解析,直接将String[].class改为List.class是不行的。对于Java来说List和List这两个字节码文件都是List.class,这是Java泛型使用时要注意的“泛型擦除”。

当我们希望将Json字符串数组使用List解析(List对于增删都是比较方便)

2)使用List解析

Gson gson = new Gson();

String jsonArray = "[\"Android\",\"Java\",\"PHP\"]";
List stringList =

gson.fromJson(jsonArray, new TypeToken>() {}.getType());
Log.e("LKing","str = "+stringList.toString());//结果:[Android,Java,PHP]

注:TypeToken的构造方法是protected修饰的,所以上面才会写成

new TypeToken>(){}.getType

而不是new TypeToken>().getType

点击复制链接 与好友分享!回本站首页
上一篇:Android签名机制之---签名过程详解
下一篇:【Android】【LCD】LCD开发常见问题&分析
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站