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
带泛型的集合类型 gson
- Gson gson = new GsonBuilder().create();
- Type typeToken = new TypeToken<Result<List<ProductListVO>>>() {
- }.getType();
- Result deserialized = gson.fromJson(json,typeToken);
抽象类处理
product类
这个对象使用了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应该是我最常用的,但是由于它本身很强大,所以并没有去仔细看过,以后有的话再补上。