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:成员变量名就是Jsonkey

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;

当上面的keyemailAddressemail_addressemail)出现任何一个时都可以获取其对应的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]);//结果:AndroidJavaPHP
}

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

原创粉丝点击