問(wèn)題
Fastjson 嵌套序列化 'bug', 某些情況下會(huì)輸出{"$ref" : "$.a[1].b[2].c[3]"} 不正常的 JSON。
事故現(xiàn)場(chǎng)
一個(gè)查詢(xún)返回的結(jié)果集嵌套較深,類(lèi)似如下結(jié)構(gòu):
{
"className":"三年一班",
"students":[
{
"studentName":"小明",
"courses":[
{
"courseName": "英語(yǔ)",
"lesson": "4"
},
{
"courseName": "體育",
"lesson": "2"
}
]
},
{
"studentName":"小紅",
"courses":[
{
"courseName": "語(yǔ)文",
"lesson": "4"
},
{
"courseName": "數(shù)學(xué)",
"lesson": "4"
}
]
}
]
}
使用 Fastjson 輸出該結(jié)構(gòu)時(shí), 有時(shí)會(huì)輸出以下格式:
{
"className":"三年一班",
"students":[
{
"studentName":"小明",
"courses":[
{
"courseName": "英語(yǔ)",
"lesson": "4"
},
{
"courseName": "體育",
"lesson": "2"
}
]
},
{
"studentName":"小紅",
# 程序正常,但序列化錯(cuò)誤
"courses":[
{"$ref":"$.class.students[1].courses[0]"},
{"$ref":"$.class.students[1].courses[1]"}
]
}
]
}
原因及解決方法
原因
當(dāng)兩個(gè)Json對(duì)象屬性中引用了同一個(gè)對(duì)象,除了第一個(gè)對(duì)象會(huì)正常顯示,其他的引用會(huì)用 “$ref”代替。
解決方法
在一番尋找后在官方的github issue中找到了相似的問(wèn)題。
// 1. 調(diào)用 toJsonString 方法時(shí)設(shè)置 DisableCircularReferenceDetect(禁用循環(huán)引用保護(hù))
JSONObject.toJSONString(json, SerializerFeature.DisableCircularReferenceDetect)
// 2. 設(shè)置全局的SerializerFeature
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);