fastjson和gson反序列化时的嵌套集合和抽象类处理
带泛型的集合类型
当使⽤toJson(obj)时,Gson调⽤Class()获取字段信息以在序列化中使⽤。类似的,也可以将对象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>>>() {};fastjson常用方法
Result deserialized = JSON.parseObject(json, Type());
带泛型的集合类型 gson
Gson gson = new GsonBuilder().create();
Type typeToken = new TypeToken<Result<List<ProductListVO>>>() {
}.getType();
Result deserialized = gson.fromJson(json, typeToken);
抽象类处理
product类
import org.apachemons.lang3.tuple.Pair;
public class ProductListVO {
private long id;
private String title;
private List<Pair> properties;//属性对
//...省略get set ⽅法
}
这个对象使⽤了apache Pair,这是个抽象类,有两个实现 ImmutablePair 和 MutablePair。 ImmutablePair 是没有默认构造函数的,抽象类也不能直接创建对象,所以反序列化时会出错。这时就需要⾃定义反序列化类型了。
fastjson ⾃定义反序列化类型
@Override
public < T > T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
Map map = parser.parseObject(Map.class);
return (T) ImmutablePair.("key"), ("value"));
}
@Override
public int getFastMatchToken() {
return0;
}
});
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 = AsJsonObject();
return ImmutablePair.("key").getAsString(), ("value").getAsString());
}
}).create();
就这些。
另:fastjson还可以直接写类名写到json⾥⾯,这样就⽅便反序列化了。不过对于⽆默认构造函数的还是⽆能为⼒。
其它:jackson应该是我最常⽤的,但是由于它本⾝很强⼤,所以并没有去仔细看过,以后有的话再补上。