Gson简单使用

来源:互联网 发布:周杰伦 稻香 知乎 编辑:程序博客网 时间:2024/05/16 14:11

前言

本文引用你真的会用Gson吗?Gson使用指南(一)来学习,作为自己的笔记记录。
代码片段均出自以上原文
Gson是google拿来解析json的一个框架,大快人心。
首先是环境依赖:
版本可能有不同

compile 'com.google.code.gson:gson:2.7'

然后在代码里面可以直接创建一个Gson的实例,调用toJson和fromJson就可以实现相应的操作

序列化和反序列化

基本数据类型

        Gson mGson=new Gson();        int i=mGson.fromJson("100",int.class);        double d = mGson.fromJson("\"99.99\"", double.class);        boolean b = mGson.fromJson("true", boolean.class);        String str = mGson.fromJson("String", String.class);        System.out.println(str);//String        System.out.println(d);//99.99        System.out.println(b);//true        System.out.println(i);//100
        Gson gson = new Gson();        String jsonNumber = gson.toJson(100);               String jsonBoolean = gson.toJson(false);            String jsonString = gson.toJson("String");         System.out.println(jsonBoolean);//false        System.out.println(jsonNumber);//100        System.out.println(jsonString);//"String"

可以看到,这里用toJson的方法来序列化自己的数据,用fromJson的方法来反序列化接受到的Json数据
值得注意的是,在反序列化的时候

 boolean b = mGson.fromJson("true", boolean.class);  System.out.println(b);//true

这里可以看出Gson具备纠错能力。

数组和List类型

         Gson gson = new Gson();        String jsonArray = "[\"Android\",\"Java\",\"PHP\"]";        String[] strings=gson.fromJson(jsonArray,String[].class);        System.out.println(strings[0]);//Android
        Gson gson = new Gson();        String jsonArray = "[\"Android\",\"Java\",\"PHP\"]";        List<String> list=gson.fromJson(jsonArray,new TypeToken<List>(){}.getType());        System.out.println(list.get(0));//Android

因为List在增删上面更具有灵活性,所有一般会选择List来处理数组型的数据,不过可以看到,String[]可以和其他基本数据类型一样直接用String[].class作为参数传入fromJson,List则必须通过一次getType来返回Type类型的数据
查看源码可以发现,二者调用的分别是

public <T> T fromJson(String json, Class<T> classOfT)//直接用基本数据类型.classpublic <T> T fromJson(String json, Type typeOfT)//需要一个Type类型参数

而且发现 这里面是支持范型操作的 这个很重要

实体类的生成和解析

习惯上,我们喜欢用一个javaBean实体类来处理Json数据

public class User {    //妈的智障java的getter和setter真是神烦啊    public String name;    @SerializedName(value = "age",alternate = {"AGE","Age"})    public int age;    public String emailAddress;}
         Gson gson = new Gson();        User user = new User("怪盗kidou",24);        String jsonObject = gson.toJson(user);        System.out.println(jsonObject);//{"name":"怪盗kidou","age":24}
        Gson gson = new Gson();        String jsonString = "{\"name\":\"怪盗kidou\",\"AGE\":24,\"Age\":27}";        User user = gson.fromJson(jsonString, User.class);        System.out.println(user.getAge());//27

总结:
1.依然是通过toJson和fromJson来负责生成和解析。
2.本地bean类型的变量名需要和Json的节点名一致。
3.使用@SerializedName注解可以处理节点名不一致的情况。这里注明age,AGE,Age都代表age属性,多个符合注解的数据传入则取最后一个。

泛型

前面看到fromJson方法是支持泛型操作的,这里的意义在于定义本地Bean类型的时候,不需要重复定义。
还是那个例子

public class User {    public String name;    @SerializedName(value = "age",alternate = {"AGE","Age"})    public int age;    public String emailAddress;}

现在我的emailAddress属性是一个String类型,但是如果有一天邮箱变成了很多个,这要怎么办呢
再定义一个List类型的成员变量么?
显然这里用泛型是最好的解决办法

public class UserT<T> {    public String name;    public int age;    public T emailAddress;}

接受单个String类型的时候,一切照旧
当Json现在传递的是一个数组类型的时候,依然只需要像上面那样用一个Type类型作为参数传入fromJson就搞定,不需要反复的更改User类型,不变应万变。

Gson gson = new Gson();        String jsonString = "{\"name\":\"怪盗kidou\",\"age\":24," +                "\"emailAddress\":[\"Android\",\"Java\",\"PHP\"]}";        UserT<List<String>> userT = gson.fromJson(jsonString, new TypeToken<UserT>(){}.getType());        System.out.println(userT.getEmailAddress().get(0));//Android
0 0
原创粉丝点击