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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容