fastjson和gson反序列化时的嵌套集合和抽象类处理
来源:互联网 发布:京东联盟源码 编辑:程序博客网 时间:2024/06/07 01:22
gson参考:http://www.letiantian.me/2014-05-22-java-gson-json/
fastjson参考:https://github.com/alibaba/fastjson/wiki/ObjectDeserializer_cn
带泛型的集合类型
当使用toJson(obj)时,Gson调用obj.getClass()获取字段信息以在序列化中使用。类似的,也可以将对象MyClass.class作为参数传递给fromJson(json, MyClass.class)方法,这可以在在对象不是泛型的时候使用。不过,当对象是一个泛型类型的对象,由于Java中类型擦除(Type Erasure)这一机制,泛型类型信息会丢失。
带泛型的集合类型 fastjson
//错误代码Result deserialized = JSON.parseObject(json, Result.class);//正确代码,需要使用泛型创建一个类以获取真实泛型。因为java中不能写Result<List<Product>>.class,所以需要借助另一个类TypeReference typeReference = new TypeReference<Result<List<Product>>>() {};Result deserialized = JSON.parseObject(json, typeReference.getType());
带泛型的集合类型 gson
Gson gson = new GsonBuilder().create();Type typeToken = new TypeToken<Result<List<ProductListVO>>>() { }.getType();Result deserialized = gson.fromJson(json, typeToken);
抽象类处理
product类
import org.apache.commons.lang3.tuple.Pair;public class ProductListVO { private long id; private String title; private List<Pair> properties;//属性对 //...省略get set 方法}
这个对象使用了apache Pair,这是个抽象类,有两个实现 ImmutablePair 和 MutablePair。 ImmutablePair 是没有默认构造函数的,抽象类也不能直接创建对象,所以反序列化时会出错。这时就需要自定义反序列化类型了。
fastjson 自定义反序列化类型
ParserConfig.getGlobalInstance().putDeserializer(Pair.class, new ObjectDeserializer() { @Override public < T > T deserialze(DefaultJSONParser parser, Type type, Object fieldName) { Map map = parser.parseObject(Map.class); return (T) ImmutablePair.of(map.get("key"), map.get("value")); } @Override public int getFastMatchToken() { return 0; } });
gson自定义反序列化类型
Gson gson = new GsonBuilder().registerTypeAdapter(Pair.class, new JsonDeserializer < ImmutablePair > () { @Override public ImmutablePair deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject jsonObject = json.getAsJsonObject(); return ImmutablePair.of(jsonObject.get("key").getAsString(), jsonObject.get("value").getAsString()); }}).create();
就这些。
另:fastjson还可以直接写类名写到json里面,这样就方便反序列化了。不过对于无默认构造函数的还是无能为力。
其它:jackson应该是我最常用的,但是由于它本身很强大,所以并没有去仔细看过,以后有的话再补上。
0 0
- fastjson和gson反序列化时的嵌套集合和抽象类处理
- fastJson和Gson的比较
- Gson和Fastjson的使用
- fastJSON和GSON的解析
- Android fastJson和Gson
- Gson、Jackson和FastJSON
- Gson教程二(译):嵌套对象的序列化和反序列化
- json之Gson和FastJson
- Gson和Fastjson解析对比
- FastJSON、Jackson和Gson用法
- fastjson使用(六) -- 序列化和反序列化的时候日期处理
- fastJson序列化和反序列化 中空字符串的处理
- Fastjson使用 -- 序列化和反序列化的时候日期处理
- fastjson、gson、jackson序列化和反序列化性能对比
- FastJson和Gson解析json的小例子
- Android常用Json解析框架GSON和FastJson的使用
- Gson 和 Fastjson 你不知道的事
- 使用Gson和FastJson解析JSON数据遇到的问题
- web前端-HTML速查列表-021
- 升级Xcode8访问相机 麦克风注意事项
- 第五周项目5后缀表达式
- 浅析MySQL内存的使用说明(全局缓存+线程缓存)
- 贴片0603蓝光led启动电压
- fastjson和gson反序列化时的嵌套集合和抽象类处理
- Ubuntu 14.04 为 root 帐号开启 SSH 登录 启动的时候需要改的启动项类比centos
- android 在framework层增加服务后编译报错
- strlen和sizeof的区别……
- Android项目中如何用好构建神器Gradle?
- tmocat 内存溢出导致电脑卡顿
- 一些博客点和技术文章
- 非010串
- Wordvec的使用实现