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  

Java代码   
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import org.codehaus.jackson.annotate.JsonBackReference;
  4. import org.codehaus.jackson.annotate.JsonManagedReference;
  5. public class TreeNode {
  6. String name;
  7. @JsonBackReference
  8. //  @JsonIgnore
  9. TreeNode parent;
  10. @JsonManagedReference
  11. List<TreeNode> children;
  12. public TreeNode() {
  13. }
  14. public TreeNode(String name) {
  15. this.name = name;
  16. }
  17. public String getName() {
  18. return name;
  19. }
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23. public TreeNode getParent() {
  24. return parent;
  25. }
  26. public void setParent(TreeNode parent) {
  27. this.parent = parent;
  28. }
  29. public List<TreeNode> getChildren() {
  30. return children;
  31. }
  32. public void setChildren(List<TreeNode> children) {
  33. this.children = children;
  34. }
  35. public void addChild(TreeNode child) {
  36. if (children == null)
  37. children = new ArrayList<TreeNode>();
  38. children.add(child);
  39. }
  40. }

JsonTest.java  

Java代码   
  1. import java.io.IOException;
  2. import org.codehaus.jackson.JsonGenerationException;
  3. import org.codehaus.jackson.map.JsonMappingException;
  4. import org.codehaus.jackson.map.ObjectMapper;
  5. import org.junit.AfterClass;
  6. import org.junit.BeforeClass;
  7. import org.junit.Test;
  8. public class JsonTest {
  9. static TreeNode node;
  10. @BeforeClass
  11. public static void setUp() {
  12. TreeNode node1 = new TreeNode("node1");
  13. TreeNode node2 = new TreeNode("node2");
  14. TreeNode node3 = new TreeNode("node3");
  15. TreeNode node4 = new TreeNode("node4");
  16. TreeNode node5 = new TreeNode("node5");
  17. TreeNode node6 = new TreeNode("node6");
  18. node1.addChild(node2);
  19. node2.setParent(node1);
  20. node2.addChild(node3);
  21. node3.setParent(node2);
  22. node2.addChild(node4);
  23. node4.setParent(node2);
  24. node3.addChild(node5);
  25. node5.setParent(node3);
  26. node5.addChild(node6);
  27. node6.setParent(node5);
  28. node = node3;
  29. }
  30. @Test
  31. public void test() throws JsonGenerationException, JsonMappingException, IOException {
  32. ObjectMapper mapper = new ObjectMapper();
  33. String json = mapper.writeValueAsString(node);
  34. System.out.println(json);
  35. TreeNode readValue = mapper.readValue(json, TreeNode.class);
  36. System.out.println(readValue.getName());
  37. }
  38. @AfterClass
  39. public static void tearDown() {
  40. node = null;
  41. }
  42. }

原文地址:https://blog.csdn.net/qq_35357001/article/details/55505659

jackson中的@JsonBackReference和@JsonManagedReference,以及@JsonIgnore的更多相关文章

  1. jackson中的@JsonBackReference

    #    StackOverflowError / 无限递归 / json递归 / JsonBackReference 环境:springmvc+hibernate+json 在controller返 ...

  2. jackson中@JsonProperty、@JsonIgnore等常用注解总结

    本文为博主原创,未经允许不得转载: 最近用的比较多,把json相关的知识点都总结一下,jackjson的注解使用比较频繁, jackson的maven依赖 <dependency> < ...

  3. jackson中JSON字符串节点遍历和修改

    有些场景下,在实现一些基础服务和拦截器的时候,我们可能需要在不知道JSON字符串所属对象类型的情况下,对JSON字符串中的某些属性进行遍历和修改,比如,设置或查询一些报文头字段. 在jackson中, ...

  4. 关于Jackson中JsonNode的取值asText()和textValue()区别

    在 比较高版本的Jackson 中, 包名为 com.fasterxml.jackson String jsonText="{\"name\":\"张三\&qu ...

  5. Jackson中的那些坑

    不符合驼峰规范的变量 “驼峰命名法”请自行百度.简单的来说就是变量的第一个单词以小写字母开始其他单词首字母大写,或者全部单词首字母都大写,分别称为“小驼峰”和“大驼峰” 比如一个符合驼峰规范命名的实体 ...

  6. Jackson中@JsonProperty等常用注解

    Java生态圈中有很多处理JSON和XML格式化的类库,Jackson是其中比较著名的一个.虽然JDK自带了XML处理类库,但是相对来说比较低级 本文将介绍的Jackson常用注解:精简概述 Jack ...

  7. net.sf.json和 com.fasterxml.jackson中对象转json的区别

    近期做项目的时候,发现使用net.sf.json包中的JSONObject或JSONArray将对象转为json数据结构存在一个坑.当对String类型的属性赋值为null情况下,转为json结构为& ...

  8. Jackson中处理map中的null key 或者null value 及实体字段中的null value

    1.map中有null key时的序列化  当有null key时,jackson序列化会报 Null key for a Map not allowed in JSON (use a convert ...

  9. 【java】jackson 中JsonFormat date类型字段的使用

    为了便于date类型字段的序列化和反序列化,需要在数据结构的date类型的字段上用JsonFormat注解进行注解具体格式如下 @JsonFormat(pattern = "yyyy-MM- ...

随机推荐

  1. CWnd::Attach()具体解释

    CWnd::Attach Attaches a Windows window to a CWnd object. BOOL Attach(    HWND hWndNew ); Parameters ...

  2. linux系统命令配置文件

    系统命令要独占地控制系统,并让一切正常工作.所有如 login(完成控制台用户身份验证阶段)或 bash(提供用户和计算机之间交互)之类的程序都是系统命令.因此,和它们有关的文件也特别重要.这一类别中 ...

  3. 50倍时空算力提升,阿里云RDS PostgreSQL GPU版本上线

    2019年3月19日,阿里云RDS PostgreSQL数据库GPU规格版本正式上线,开启了RDS异构计算并行加速之路.该版本在RDS(关系型数据库服务)的云基础设施层面首次完成了与阿里云异构计算产品 ...

  4. BootstrapValidation一些tips

    BootstrapValidation一些tips:1. callback的用法 如果你有一些特别的检查需要,比如两个元素必需有一个有值,你可以在两个元素上加上callback,例:sel和cb必需有 ...

  5. Directx11教程36 纹理映射(6)

    原文:Directx11教程36 纹理映射(6)    本章主要是整理代码,做以下两件事情: 1.把世界坐标矩阵的计算,放在GraphicsClass的渲染函数中,之前放在D3DClass中,而且只是 ...

  6. Jmeter里面的时间单位

    1.线程组里面的时间单位为秒(s),如下图:

  7. Pycurl介绍

    pycurl — A Python interface to the cURL library Pycurl包是一个libcurl的Python接口.pycurl已经成功的在Python2.2到Pyt ...

  8. Oracle使用——impdp导入数据时数据表已经存在

    背景 在做数据迁移时,需要将不同地方的dmp文件整合到一个数据库中,在导入时,目标表已经存在,该如何把数据追加进入目标表中 方法介绍 当使用IMPDP完成数据库导入时,如遇到表已存在时,Oracle提 ...

  9. mysql 使用concat模糊查询

    如果这三个字段中有值为NULL,则返回的也是NULL,那么这一条记录可能就会被错过,使用IFNULL进行判断 SELECT * FROM `magazine` WHERE CONCAT(IFNULL( ...

  10. 微信小程序左滑显示按钮demo

    wxml结构(删除部分代码): <view class="chapter-item" wx:for="{{klgData}}" data-index=&q ...