本文记录一下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类相关字段添加注解即可。
123 >("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
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
有关进一步的泛型封装可以参考一下[这篇文章][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解析类似,
|
|
流式序列化 [ 将对象装化成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(){ public boolean shouldSkipField(FieldAttributes f) { //过滤掉不想要的字段 } public boolean shouldSkipClass(Class<? clazz) { //过滤掉不想要的类 } }).create();POJO与Json之前的字段映射规则 [主要是一些字段的对应关系]
[后续内容参考][http://www.jianshu.com/p/3108f1e44155]