Skip to content

[BUG]JSON.paseObject(String json, Class clazz),当Class参数为Object.class,无法解析$ref结构的数据 #3452

@tengzuwen

Description

@tengzuwen

问题描述

简要描述您碰到的问题。
fastjson2在使用JSON.paseObject(String json, Class clazz)的API时,若传入的数据存在循环引用$ref,则无法正确处理$ref的结构数据

环境信息

请填写以下信息:

  • OS信息: [e.g.:CentOS 8.4.2105 4Core 3.10GHz 16 GB]
  • JDK信息: [e.g.:Openjdk 1.8.0_312]
  • 版本信息:[e.g.:Fastjson2 2.0.53]

重现步骤

如何操作可以重现该问题:

  1. 使用 JSON.paseObject(String json, Class clazz) 方法
  2. 输入 {"extInfo":{"$ref":"$.otherInfo.extInfo"},"id":1,"otherInfo":{"extInfo":{"age":23}}} 数据
  3. 出现 ... 错误
public class FastJsonTest {

    @Test
    public void testParseObject() {
        String json = "{\"extInfo\":{\"$ref\":\"$.otherInfo.extInfo\"},\"id\":1,\"otherInfo\":{\"extInfo\":{\"age\":23}}}";
        
        // 该情况下,fastjson1可以正常解析出$ref的结构数据,而fastjson2无法解析
        Object objectV1 = com.alibaba.fastjson.JSON.parseObject(json, Object.class);
        Object objectV2 = com.alibaba.fastjson2.JSON.parseObject(json, Object.class);

        // 该情况下,fastjson1和fastjson2都可以正常解析
        User userV1 = com.alibaba.fastjson.JSON.parseObject(json, User.class);
        User userV2 = com.alibaba.fastjson2.JSON.parseObject(json, User.class);

        // 该情况下,fastjson1和fastjson2都可以正常解析
        com.alibaba.fastjson.JSONObject jsonObjectV1 = com.alibaba.fastjson.JSON.parseObject(json);
        com.alibaba.fastjson2.JSONObject jsonObjectV2 = com.alibaba.fastjson2.JSON.parseObject(json);
    }
}

相关类结构如下@Data
public class User {
    private Long id;

    private Map<String, Object> extInfo;

    private OtherInfo otherInfo;
}


@Data
public class OtherInfo {
    private Map<String, Object> extInfo;
}

期待的正确结果

对您期望发生的结果进行清晰简洁的描述。
只有在Class参数传Object.class才有此问题;当使用不带Class参数的API或使用该json对应实体对象的Class传入,均可以正常解析

相关日志输出

请复制并粘贴任何相关的日志输出。

附加信息

如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。

Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingfixed

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions