现在,我把问题,清楚的描述一遍,直接上代码:class Foo extends HashMap {
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()); // 为null
Jackson和Fastjson都是如此,究其原因,是因为序列化和反序列化时,Foo类被当做Map处理了。
前面说了,国外论坛上那些解决方案都不好,我想到了一个简单有效的方案,就是修改get方法:class Foo extends HashMap {
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配置进行任何修改。