liubobuzhidao

gson解析的使用方法

本文记录一下gson的使用心得

1、基本用法

生成Json:

Gson gson = new Gson();

Student stu = new Student();

String objStr = gson.toJson(stu);

解析Json:

Gson gson = new Gson();

Student stu = gson.fromJson(result,Student.class);

String –> Json[如何将一个String转成jsonobject]:

JsonParser parser = new JsonParaser();

JsonObject json = parser.parse(“”).getAsJsonObject();

2、一定的容错机制

什么意思?也就是说当后台接口和你需要的字段名字不一样,比如说后台传给你的是taskId,而你需要的是workId,谁都不愿意改字段,让谁改也都不好。所以呢,就需要有容错机制,那面对这样的问题使用Gson该怎么解决呢?

Gson在序列化和反序列化的时候使用了反射,而和反射关系最紧密的莫过于注解了,鉴于上面的那种情况只需要在本地的PoJo类相关字段添加注解即可。

1
2
3
>@SerializedName("taskId")
>public String workId;
>

这样还不算完事!!!还不行吗?还不行,如果接口设置不严禁出现多种写法怎么办?其实也好办,SerializedName有两个属性:value、alternate,然后这个字段可以改为@SerializedName(value=”taskId”,alternate={“name1”,”name2”})

3、泛型的使用

通常来讲Gson解析基本数据类型时可以像解析POJO时一样,将数据源和数据类型的类型放到对应的位置即可,例如gson.fromJson(“src”,*.class);当我们遇到数组类型的数据时该怎么搞呢?最简单的方法就是刚才的那种。如下:

String res = [“JavaScript”,”Python”,”Java”,”Android”,”IOS”];

String[] array = gson.fromJson(res,String.class);

这里有个问题,什么问题呢?就是array在使用上没有List方便,那么如果我想直接得到List该怎么办呢?直接写List.class?实际操作运行报错!此路不通,此时需要请出TypeToken了。

List stringList = gson.fromJson(jsonArray, new TypeToken>() {}.getType());

这就完了。如果你觉得这也太简单了吧!那你就错了,在实际的使用的中泛型有很大的用处,后台在设计接口的时候一般都会给出这样格式的数据:

{“code”:0,”msg”,”success”,”result”:{}}

我们可以发现大部分的接口都有code、msg字段,不同只是result。那么为了重用性,接收数据时的PoJO可以设置为:

public class Result{

​ public int code;

​ public String msg;

​ public T result;

}

然后再根据现有的业务,构建不同的数据结构,在使用的时候只需 传入new TypeToken>(){}.getType();

有关进一步的泛型封装可以参考一下[这篇文章][http://www.jianshu.com/p/d62c2be60617]。

4、来一点儿不一样的

Gson与流一块儿使用:

  • 流式反序列化 [将json转换成指定对象]

    • Gson.fromJson(String,Class);

    • Gson.fromJson(Reader,Class);

    • Gson.fromJson(String,Type);

    • Gson.fromJson(Reader,Type);

    • 手动方式 [使用JsonReader类来实现]

与使用pull解析类似,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
String json = "";
Person person = new Person();
JsonReader reader = new JsonReader(new StringReader(json));
reader.beginObject();
while(reader.hasNext()){
​ String s = reader.nextName();
switch(s){
case "name":
​ user.setName(reader.nextString());
break;
​ 。。。
​ }
}
reader.endObject();
  • 流式序列化 [ 将对象装化成json字符串]

    • 自动方式 gson.toJson(bean);

    • 手动方式 [beginObject/endObject、beginArray/endArray]

      JsonWriter writer = new JsonWriter(new OutputStreamWriter(System.out));//输出到控制台

      writer.beginObject().name(“name”).value(“测试”).name(“age”).value(“测试”).endObject();

      writer.flush();

    5、使用定制化的Gson

    通常使用的Gson gson = new Gson();是已经配置好的,使用的是默认配置属性,如果现在有需求使用定制化的Gson,一般有什么情况呢,比如:输入值为null的键[Gson默认是不导出值为null的键],输出固定格式的时间等。

    这个时候就用到了GsonBuilder类。

    Gson gson = new GsonBuilder()

    ​ .serializeNulls(). //序列化null

    ​ .setDateFormate(“yyyy-MM-dd”) // 设置日期时间格式,

    ​ .disableInnerClassSerialization() //禁止序列化内部类

    ​ .setPrettyPrinting //格式化输出

    ​ .create();

    6、Gson的高级用法

  • 过滤掉某些字段[有以下几种]

    • 基于@Expose 注解

    • 基于版本

    • 基于访问修饰符

    • 基于策略 [自定义规则]

    
      Gson gson = new GsonBuilder().addSerializationExclusionstrategy(new ExclusionStrategy(){
    
      @Override            
    
       public boolean shouldSkipField(FieldAttributes f) {
    ​   //过滤掉不想要的字段
    ​  }
    
      @Override
    
       public boolean shouldSkipClass(Class<? clazz) {
    ​         //过滤掉不想要的类
    ​  }
    
    }).create();
    
  • POJO与Json之前的字段映射规则 [主要是一些字段的对应关系]

  • [后续内容参考][http://www.jianshu.com/p/3108f1e44155]