当前位置:网站首页>@JsonBackReference和@JsonManagedReference(解决对象中存在双向引用导致的无限递归)
@JsonBackReference和@JsonManagedReference(解决对象中存在双向引用导致的无限递归)
2022-07-06 08:30:00 【XYLANCC】
jackson中的@JsonBackReference和@JsonManagedReference,以及@JsonIgnore均是为了解决对象中存在双向引用导致的无限递归(infinite recursion)问题。这些标注均可用在属性或对应的get、set方法中。
@JsonBackReference和@JsonManagedReference:这两个标注通常配对使用,通常用在父子关系中。@JsonBackReference标注的属性在序列化(serialization,即将对象转换为json数据)时,会被忽略(即结果中的json数据不包含该属性的内容)。@JsonManagedReference标注的属性则会被序列化。在序列化时,@JsonBackReference的作用相当于@JsonIgnore,此时可以没有@JsonManagedReference。但在反序列化(deserialization,即json数据转换为对象)时,如果没有@JsonManagedReference,则不会自动注入@JsonBackReference标注的属性(被忽略的父或子);如果有@JsonManagedReference,则会自动注入自动注入@JsonBackReference标注的属性。
@JsonIgnore:直接忽略某个属性,以断开无限递归,序列化或反序列化均忽略。当然如果标注在get、set方法中,则可以分开控制,序列化对应的是get方法,反序列化对应的是set方法。在父子关系中,当反序列化时,@JsonIgnore不会自动注入被忽略的属性值(父或子),这是它跟@JsonBackReference和@JsonManagedReference最大的区别。
示例测试代码(注意反序列化后的TreeNode[readValue]的children里的parent):
TreeNode.java
import java.util.ArrayList;
import java.util.List;
import org.codehaus.jackson.annotate.JsonBackReference;
import org.codehaus.jackson.annotate.JsonManagedReference;
public class TreeNode {
String name;
@JsonBackReference
// @JsonIgnore
TreeNode parent;
@JsonManagedReference
List<TreeNode> children;
public TreeNode() {
}
public TreeNode(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public TreeNode getParent() {
return parent;
}
public void setParent(TreeNode parent) {
this.parent = parent;
}
public List<TreeNode> getChildren() {
return children;
}
public void setChildren(List<TreeNode> children) {
this.children = children;
}
public void addChild(TreeNode child) {
if (children == null)
children = new ArrayList<TreeNode>();
children.add(child);
}
}
JsonTest.java
Java代码 收藏代码
import java.io.IOException;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class JsonTest {
static TreeNode node;
@BeforeClass
public static void setUp() {
TreeNode node1 = new TreeNode("node1");
TreeNode node2 = new TreeNode("node2");
TreeNode node3 = new TreeNode("node3");
TreeNode node4 = new TreeNode("node4");
TreeNode node5 = new TreeNode("node5");
TreeNode node6 = new TreeNode("node6");
node1.addChild(node2);
node2.setParent(node1);
node2.addChild(node3);
node3.setParent(node2);
node2.addChild(node4);
node4.setParent(node2);
node3.addChild(node5);
node5.setParent(node3);
node5.addChild(node6);
node6.setParent(node5);
node = node3;
}
@Test
public void test() throws JsonGenerationException, JsonMappingException, IOException {
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(node);
System.out.println(json);
TreeNode readValue = mapper.readValue(json, TreeNode.class);
System.out.println(readValue.getName());
}
@AfterClass
public static void tearDown() {
node = null;
}
}
边栏推荐
- JS native implementation shuttle box
- PLT in Matplotlib tight_ layout()
- Report on Market Research and investment prospects of China's silver powder industry (2022 Edition)
- [cloud native topic -45]:kubesphere cloud Governance - Introduction and overall architecture of enterprise container platform based on kubernetes
- Is it safe to open an account in Zheshang futures?
- sublime text的编写程序时的Tab和空格缩进问题
- IOT -- interpreting the four tier architecture of the Internet of things
- Migrate data from SQL files to tidb
- Online yaml to CSV tool
- leetcode刷题 (5.31) 字符串
猜你喜欢
pcd转ply后在meshlab无法打开,提示 Error details: Unespected eof
All the ArrayList knowledge you want to know is here
The ECU of 21 Audi q5l 45tfsi brushes is upgraded to master special adjustment, and the horsepower is safely and stably increased to 305 horsepower
Use Alibaba icon in uniapp
CISP-PTE实操练习讲解
深度剖析C语言数据在内存中的存储
Ruffian Heng embedded bimonthly, issue 49
JS native implementation shuttle box
个人电脑好用必备软件(使用过)
JS inheritance method
随机推荐
torch建立的网络模型使用torchviz显示
Leetcode question brushing (5.31) string
LDAP應用篇(4)Jenkins接入
[brush questions] top101 must be brushed in the interview of niuke.com
Research Report on supply and demand and development prospects of China's high purity aluminum market (2022 Edition)
sublime text没关闭其他运行就使用CTRL+b运行另外的程序问题
704 二分查找
Use dumping to back up tidb cluster data to S3 compatible storage
根据csv文件某一列字符串中某个数字排序
The ECU of 21 Audi q5l 45tfsi brushes is upgraded to master special adjustment, and the horsepower is safely and stably increased to 305 horsepower
C language custom type: struct
Remote storage access authorization
Research and investment forecast report of citronellol industry in China (2022 Edition)
FairGuard游戏加固:游戏出海热潮下,游戏安全面临新挑战
3. File operation 3-with
Upgrade tidb operator
[cloud native topic -45]:kubesphere cloud Governance - Introduction and overall architecture of enterprise container platform based on kubernetes
ROS编译 调用第三方动态库(xxx.so)
Personalized online cloud database hybrid optimization system | SIGMOD 2022 selected papers interpretation
sublime text中conda环境中plt.show无法弹出显示图片的问题