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. linux 下批量在多文件中替换字符串

    sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录` 注意:`` 符号在shell里面正式的名称叫做backquote , 一般叫做命令替换其作用 ...

  2. Vue. 之 npm安装Element

    Vue. 之 npm安装Element 前提: 相关运行环境以搭建完成,例如:Node.Npm等.    假如我的项目目录如下: D:\DISK WORKSPACE\VSCODE\CDS\cds-ap ...

  3. 【难为听】weex-ui

    eslint 不喜欢,但是确实规范了代码,同古代统一货币一样,有无穷的意义.故喜欢 weex-ui在项目中的使用方法 npm install -g weex-toolkit@latest weex c ...

  4. PHP 从 MongoDb 中查询数据怎么样实现

    一.软件环境(版本非必须) php v5.6 扩展:MongoDB nginx v1.11 mongodb v3.2 note: 必须安装MongoDB扩展 二.连接 $client = new Mo ...

  5. PHP核心编程--目录操作(包含文件操作)

    一.目录操作 1.    创建目录 创建目录mkdir(目录名称)  //返回值为布尔 一次性创建主目录及其子目录 判断是不是一个目录is_dir  //返回true,false 判断目录或文件是否存 ...

  6. 【Leetcode Top-K问题 BFPRT】第三大的数(414)

    题目 给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是O(n). 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1. 示 ...

  7. 【时光回溯】【JZOJ3567】【GDKOI2014】石油储备计划

    题目描述 输入 输出 对于每组数据,输出一个整数,表示达到"平衡"状态所需的最小代价. 样例输入 2 3 6 1 5 1 2 1 2 3 2 5 4 5 4 3 2 1 3 1 1 ...

  8. python流程控制和循环

    变量的命名:可以由数字字母下换线组成 ,不能以数字开头,可以使用中文但是不推荐使用中文,不推荐前面使用_ __,不能使用系统的关键字,变量名严格区分大小写 逻辑运算优先级 or<and<n ...

  9. 2019-8-31-C#-循环的判断会进来几次

    title author date CreateTime categories C# 循环的判断会进来几次 lindexi 2019-08-31 16:55:58 +0800 2018-06-14 0 ...

  10. 使用multiprocessing的问题总结

    Python2中的multiprocessing模块,规避了GIL(Global Interpreter Lock)带来的多线程无法实际并发的缺点,设计了几乎与threading模块一模一样的API, ...