项目场景:
数据序列化后反序列化实现数据copy
问题描述
提示:fastjson序列化后反序列化异常。版本:1.2.83
序列化数据模型:
class SC implements Serializable {
private List<String> afield;
private List<List<String>> zfield;
public List<String> getAfield() {
return afield;
}
public void setAfield(List<String> afield) {
this.afield = afield;
}
public List<List<String>> getZfield() {
return zfield;
}
public void setZfield(List<List<String>> zfield) {
this.zfield = zfield;
}
}
注意:List的属性名必须先于List<List>属性(afield < zfield)。
测试代码:
@Test
public void testSc() {
SC sc = new SC();
sc.setAfield(Arrays.asList("a", "b"));
sc.setZfield(Arrays.asList(sc.getAfield()));
String s = JSONUtils.toJSONString(sc);
System.out.println(s);
// excption:
JSONUtils.parseObject(s, SC.class);
}
s输出的信息:
{"afield":["a","b"],"zfield":[{"$ref":"$.afield"}]}
在进行反序列化的时候会异常:
com.alibaba.fastjson.JSONException: field 0 expect '[', but {, pos 31, line 1, column 32{"afield":["a","b"],"zfield":[{"$ref":"$.afield"}]}
原因分析:
提示:fastjson 的bug
List的属性名必须先于List<List>属性(afield < zfield),fastjson会优先对afield序列化,后面序列化的属性会引用同样对象。
解决方案:
提示:1、更换版本,目前只在1.2.83版本复现。
2、禁止循环依赖
String s = JSONUtils.toJSONString(sc, SerializerFeature.DisableCircularReferenceDetect);
禁止循环依赖序列化的结果:
{"afield":["a","b"],"zfield":[["a","b"]]}