[alibaba/fastjson]无法反序列化对象引用-探讨

2024-09-02 105 views
7

A 项目服务中未设置:DisableCircularReferenceDetect,这样得到了带有引用的 JSON 字符串。

在另一个 B 项目中,使用上述引用的 JSON 字符串,无法再反解析回去了,下面给出一个示例。

A 服务提供的 JSON 字符串:

{
    "code": 0,
    "msg": "ok",
    "data":
    [
        {
            "a": 100,
            "b": 200,
            "c":
            {
                "m": 50,
                "n": 100
            }
        },
        {
            "$ref": "$.data[0].c"
        }
    ]
}

我尝试这样反解析

        JSONObject jsonObject = JSON.parseObject(str);
        System.out.println("jsonObject = " + jsonObject);

当然,用哪个 fastjson 的版本解析后均和上述一样。

jsonObject = {"code":0,"msg":"ok","data":[{"a":100,"b":200,"c":{"m":50,"n":100}},{"$ref":"$.data[0].c"}]}

估计是 JSON 字符串内容中,键值的内容本身就是 "$ref": "$.data[0].c"

可实际应用想将引用转为实际的信息,那么理想中的数据应为:

{
    "code": 0,
    "msg": "ok",
    "data":
    [
        {
            "a": 100,
            "b": 200,
            "c":
            {
                "m": 50,
                "n": 100
            }
        },
        {
            "m": 50,
            "n": 100
        }
    ]
}

不知现在是否支持这样解析?或者后续是否会有这样的设置?

回答

9

系统:win10 JDK:1.8.0_321 Fastjson: 2.0.20 也出现上述问题,@ref反序列化后得到的是$ref指向的地址 image

Fastjson版本降到1.2.83后$ref反序列化后得到的是null,但是存在富文本反序列化卡死问题,在1.2.83基础上增加Feature.DisableSpecialKeyDetect来进行序列化卡死问题得到解决,但是@ref反序列化后得到的又是$ref指向的地址 image image

这个问题能优先修复吗?