Fastjson 嵌套类序列化,出现 "$ref:xxx"

问题

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);

fastjson issues 1827

你可能感兴趣的:(Fastjson 嵌套类序列化,出现 "$ref:xxx")