问题
Fastjson 嵌套序列化 'bug', 某些情况下会输出{"$ref" : "$.a[1].b[2].c[3]"}
不正常的 JSON。
事故现场
一个查询返回的结果集嵌套较深,类似如下结构:
{
"className":"三年一班",
"students":[
{
"studentName":"小明",
"courses":[
{
"courseName": "英语",
"lesson": "4"
},
{
"courseName": "体育",
"lesson": "2"
}
]
},
{
"studentName":"小红",
"courses":[
{
"courseName": "语文",
"lesson": "4"
},
{
"courseName": "数学",
"lesson": "4"
}
]
}
]
}
使用 Fastjson 输出该结构时, 有时会输出以下格式:
{
"className":"三年一班",
"students":[
{
"studentName":"小明",
"courses":[
{
"courseName": "英语",
"lesson": "4"
},
{
"courseName": "体育",
"lesson": "2"
}
]
},
{
"studentName":"小红",
# 程序正常,但序列化错误
"courses":[
{"$ref":"$.class.students[1].courses[0]"},
{"$ref":"$.class.students[1].courses[1]"}
]
}
]
}
原因及解决方法
原因
当两个Json对象属性中引用了同一个对象,除了第一个对象会正常显示,其他的引用会用 “$ref”代替。
解决方法
在一番寻找后在官方的github issue中找到了相似的问题。
// 1. 调用 toJsonString 方法时设置 DisableCircularReferenceDetect(禁用循环引用保护)
JSONObject.toJSONString(json, SerializerFeature.DisableCircularReferenceDetect)
// 2. 设置全局的SerializerFeature
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);
网友评论