[BUG] Fastjson JSON.toJSON异常
问题描述
类似#2187,但代码使用maven依赖在mac上运行时,fastjson和fastjson2的结果不一样。在clone下来的源码中运行时,出现stackoverflow error。
环境信息
Environment of cloned source code:
- OS信息: [Ubuntu 22.04.3 LTS (GNU/Linux 6.2.0-36-generic x86_64)]
- JDK信息: [Openjdk 1.8.0_382]
- 版本信息:[Fastjson 2.0.50-SNAPSHOT] (perhaps?)
On laptop:
- OS信息: [MacOS 12.7.4 M1 Pro 16 GB]
- JDK信息: [Openjdk 17.0.6]
- 版本信息:[Fastjson 2.0.49]
重现步骤
import com.alibaba.fastjson2.*;
import com.google.common.collect.Lists;
import lombok.Data;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
public class Issue2187Mutated_119 {
@Test
public void testMutated() throws Exception {
BeanMutated bean = new BeanMutated();
bean.value = bean;
JSONObject json = (JSONObject) JSON.toJSON(bean);
assertSame(json, json.get("value"));
}
@Test
public void testMutatedfj() throws Exception {
BeanMutated bean = new BeanMutated();
bean.value = bean;
com.alibaba.fastjson.JSONObject json = (com.alibaba.fastjson.JSONObject) com.alibaba.fastjson.JSON.toJSON(bean);
assertSame(json, json.get("value"));
}
public static class BeanMutated {
public BeanMutated value;
}
@Test
public void testMutated1() throws Exception {
Bean1Mutated bean = new Bean1Mutated();
bean.values = Arrays.asList(bean);
JSONObject json = (JSONObject) JSON.toJSON(bean);
assertSame(json, json.getJSONArray("values").get(0));
}
@Test
public void testMutated1fj() throws Exception {
Bean1Mutated bean = new Bean1Mutated();
bean.values = Arrays.asList(bean);
com.alibaba.fastjson.JSONObject json = (com.alibaba.fastjson.JSONObject) com.alibaba.fastjson.JSON.toJSON(bean);
assertSame(json, json.getJSONArray("values").get(0));
}
public static class Bean1Mutated {
public List<Bean1Mutated> values;
}
@Data
public class DynFormDtoMutated {
private String sysName;
private String name;
private boolean enableTab;
private int labelColSize;
private String title;
private String hint;
private List<DynFormComponentDtoMutated> componentList;
private String notes;
}
@Data
public class DynFormComponentDtoMutated {
private String name;
private String nameText;
private String functionName;
private String compTypeName;
private JSONObject props; // 组件完整配置
private int widthColSize;
protected int widthPercentage; //宽度百分比
private String tabName;
private boolean enabled;
private long uid;
private long parentFieldId;
private List<DynFormComponentDtoMutated> subComponentList; //子组件集合
public List<DynFormComponentDtoMutated> getFlatComponentDtosMutated() {
List<DynFormComponentDtoMutated> flatList = Lists.newArrayList();
flatList.add(this);
if (this.subComponentList!= null) {
for (DynFormComponentDtoMutated tmpDto : this.subComponentList) {
tmpDto.setParentFieldId(this.uid);
flatList.addAll(tmpDto.getFlatComponentDtosMutated());
}
}
return flatList;
}
}
}
期待的正确结果
能够成功解析
相关日志输出
-
On Mac: Expected :{"values":[null]} Actual :null at Issue2187Mutated_119.testMutated1fj(Issue2187Mutated_119.java:50)
Expected :{"value":{"value":{"$ref":".."}}} Actual :{value=(this Map)} at Issue2187Mutated_119.testMutated1fj(Issue2187Mutated_119.java:50)
-
Run in cloned repository: java.lang.StackOverflowError at java.lang.reflect.Field.get(Field.java:393) at com.alibaba.fastjson.util.FieldInfo.get(FieldInfo.java:572) at com.alibaba.fastjson.serializer.FieldSerializer.getPropertyValue(FieldSerializer.java:151) at com.alibaba.fastjson.serializer.JavaBeanSerializer.getFieldValuesMap(JavaBeanSerializer.java:799) at com.alibaba.fastjson.JSON.toJSON(JSON.java:1221) at com.alibaba.fastjson.JSON.toJSON(JSON.java:1168)
fastjson的test在2.0.49能返回结果,在2.0.51-SNAPSHOT会报StackOverflowError