在进行双向Jackson序列化时,如果存在循环引用,会导致无限递归的问题。为了避免这种情况,可以使用Jackson的@JsonIdentityInfo
注解来标记循环引用的对象。
下面是一个示例代码,展示了如何使用@JsonIdentityInfo
注解来解决无限递归的问题:
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id"
)
public class User {
private int id;
private String name;
private List friends;
// getters and setters
}
public class Main {
public static void main(String[] args) throws JsonProcessingException {
User user1 = new User();
user1.setId(1);
user1.setName("Alice");
User user2 = new User();
user2.setId(2);
user2.setName("Bob");
List friends = new ArrayList<>();
friends.add(user2);
user1.setFriends(friends);
user2.setFriends(Collections.singletonList(user1));
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user1);
System.out.println(json);
}
}
在上面的示例中,User
类使用@JsonIdentityInfo
注解来标记id
属性,表示该属性用于标识对象。这样,当序列化包含循环引用的对象时,Jackson会将循环引用的对象序列化为一个引用标识,而不是递归地继续序列化。
运行上述代码会输出以下结果:
{"id":1,"name":"Alice","friends":[{"id":2,"name":"Bob","friends":[1]}]}
注意到user1
和user2
之间的循环引用被正确地处理,user2
的friends
属性被序列化为一个引用标识[1]
,指向user1
对象。
这样,通过使用@JsonIdentityInfo
注解,可以避免无限递归的问题,并正确地序列化包含循环引用的对象。