-
Notifications
You must be signed in to change notification settings - Fork 541
Closed
Labels
Milestone
Description
问题描述
简要描述您碰到的问题。
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]
重现步骤
如何操作可以重现该问题:
- 使用
JSON.paseObject(String json, Class clazz)
方法 - 输入
{"extInfo":{"$ref":"$.otherInfo.extInfo"},"id":1,"otherInfo":{"extInfo":{"age":23}}}
数据 - 出现
...
错误
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传入,均可以正常解析
相关日志输出
请复制并粘贴任何相关的日志输出。
附加信息
如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。