解决JSON序列化继承Map的自定义对象时拿不到field属性值
如题,该问题在国外论坛上已有人提出来:https://stackoverflow.com/search?q=jackson+extends+map
但是并没有满意答案,都说要使用jackson的@JsonAnySetter注解:https://stackoverflow.com/questions/31320983/jackson-serialise-map-with-extra-fields,但是这样一来就和Jackson绑定死了,换成Gson或者FastJSON就不灵了。
现在,我把问题,清楚的描述一遍,直接上代码:
class Foo<T> extends HashMap<Object, Object> {
private T data;
public Foo() {}
public Foo(T data) {
this.data = data;
put("AAAA", data);
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}Foo类继承了HashMap,而且有一个私有的属性 data,经过json序列化后,data属性丢失,被放到了map中,
当反序列化时,data属性就为null了。测试代码如下:
Foo foo = new Foo("XXXXXXXXXXXXX");
String json = Json.toJSONString(foo);//UT.Json.
System.out.println(json);
//json = "{\"data\": \"xxxxxxxxx\", \"AAAA\":\"XXXXXXXXXXXXX\"}";
foo = Json.parseObject(json, Foo.class);
System.out.println(foo);
System.out.println(foo.getData()); // 为nullJackson和Fastjson都是如此,究其原因,是因为序列化和反序列化时,Foo类被当做Map处理了。
前面说了,国外论坛上那些解决方案都不好,我想到了一个简单有效的方案,就是修改get方法:
class Foo<T> extends HashMap<Object, Object> {
private T data;
public Foo() {}
public Foo(T data) {
this.data = data;
put("AAAA", data);
}
public T getData() {
if(data!=null) {
return data;
}
return super.get("data");
}
public void setData(T data) {
this.data = data;
}
}就是 get的时候,如果拿不到,就调用map.get(key)方法获取数据。
这样完美解决问题,不需要对JSON配置进行任何修改。