1. 絮絮叨叨
-
之前,都是使用fastjson做json相关的处理,使用起来也得心应手,什么Java对象和json对象、Java对象和json字符串、json字符串和json对象之间的互转十分熟悉
-
最近,项目开发时改成了jackson。自己一下蒙了,连如何将Java对象转json字符串都不知道 😂
-
没法,还是得依靠百度,最终百度后的代码如下:
ObjectMapper objectMapper = new ObjectMapper(); String jsonContent = objectMapper.writeValueAsString(entity);
-
但是,这个别人写的entity有一个self-reference,大概示例如下:
public class User { private String name; private List<User> partners; .... }
-
就是,类A中有一个成员属性List,这样形成了self - reference,也是一种循环引用
-
这样的引用,使用
objectMapper.writeValueAsString(entity);
获取json字符串时,会出现Infinite recursion (StackOverflowError)
错误*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844 *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844 *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844 2021-03-09T12:38:42.047+0800 Infinite recursion (StackOverflowError) (through reference chain: com.google.common.collect.SingletonImmutableList[0]->execution.StageInfo["allStages"]->com.google.common.collect.SingletonImmutableList[0]->execution.StageInfo["allStages"]->com.google.common.collect.SingletonImmutableList[0]-> ...
2. 使用@JsonIdentityInfo解决问题
-
刚参加工作,年轻人吧,还是学不会释然,晚上回了家,也猛搞到2点
-
电脑没电了,自己才歇菜,睡了。可惜,还是没搞出来 😂
-
网上很多消除循环引用的方法:
@JsonManagedReference
和@JsonBackReference
的混用,解决两个类之间的循环引用:JsonManagedReference vs JsonBackReference- 直接使用
@JsonBackReference
:jackson序列化json报错java.lang.StackOverflowError - 使用
@JsonIdentityInfo
解决问题的(看起来最麻烦,但是竟然奏效了):Jackson - Serialize entity with self-reference
-
正确的回答,只是抛砖引玉了,比较完整的回答是截图处。其中,property是对象中具有唯一性的值。