开发者社区 问答 正文

fastjson 会把任何getXX 解析成字段

这里会认为jsonStr是实体类的一个属性,然后就递归报错了。当然正常可能也不会这么写。


import lombok.Data;

@Data
public class JSONTest {

	private int xx;
	private int yy;
	private int zz;
	
	public String getJson() {
		return JSON.toJSONString(this);
	}
	
	public static void main(String[] args) {
		JSONTest test = new JSONTest();
		test.getJson();
	}
}

Exception in thread "main" java.lang.StackOverflowError

"这里又发现这个编辑器有问题吧,我本来是两个代码块儿,自动就把中间的忽略了"

展开
收起
andy__wu 2019-09-04 17:28:52 923 分享 版权
阿里云 AI 助理回答

从您提供的代码片段来看,问题在于使用了 Lombok 的 @Data 注解和 Fastjson(通过 JSON.toJSONString(this);)来生成 JSON 字符串。当 Lombok 的 @Data 注解应用于类上时,它会为类的每个字段自动生成 getter 和 setter 方法。在您的 getJson() 方法中调用 JSON.toJSONString(this) 会导致 Fastjson 尝试序列化整个对象,包括调用由 Lombok 自动生成的 getter 方法。

如果您的类中有引用了该类本身的成员变量(例如,一个自引用或者循环引用的情况),这将导致无限递归,从而引发 java.lang.StackOverflowError。但从您给出的 JSONTest 类定义来看,并没有这样的自引用情况。

根据您的描述,“这里又发现这个编辑器有问题吧,我本来是两个代码块儿,自动就把中间的忽略了”,似乎暗示实际代码中可能存在未展示的部分,比如某个字段类型是指向 JSONTest 类本身的引用,这才是导致递归错误的原因。

解决方法:

  1. 检查是否有未展示的循环引用:确保类中没有直接或间接地引用自身类型的成员变量。
  2. 手动控制序列化:如果确实需要处理循环引用的情况,可以使用 Fastjson 提供的 @JSONField(serialize=false) 注解来标记不需要序列化的属性,或者使用 SerializeConfig 配置来忽略循环引用的字段。
  3. 分步序列化:对于复杂的对象结构,可能需要更细致地控制序列化过程,避免自动递归导致的问题。

由于您提到的“编辑器问题”可能导致信息丢失,如果上述分析不适用,请提供完整的代码段,以便进行更准确的诊断。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答