springmvc @ResponseBody 返回json数据错误
来源:互联网 发布:手机电影特效软件 编辑:程序博客网 时间:2024/05/19 02:26
原因:父子关系,导致jackson 死循环: 解决方案如下:见红色处
@JsonBackReference @JsonManagedReference @JsonIgnore
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
JsonTest.java
@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
- 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;
- }
- }
0 0
- springmvc @ResponseBody 返回json数据错误
- springmvc @ResponseBody 返回json数据错误
- springmvc配置responsebody返回json格式数据
- springMVC使用@ResponseBody返回json
- SpringMVC@ResponseBody返回JSON乱码
- easyui ajax请求获取SpringMVC @ResponseBody返回Json数据
- Springmvc 4.x利用@ResponseBody返回Json数据
- Springmvc 4.x利用@ResponseBody返回Json数据
- SpringMVC返回json数据(@ResponseBody注解的使用)
- SpringMVC @ResponseBody返回json数据 浏览器406 error 解析
- Springmvc 4.x利用@ResponseBody返回Json数据
- @ResponseBody返回JSON数据时遇到406错误
- @ResponseBody返回JSON数据时遇到406错误
- 配置SpringMVC返回JSON遇到的坑/SpringMVC @ResponseBody 415错误处理
- SpringMVC返回JSON数据406错误处理
- springmvc使用@ResponseBody返回json乱码解决方法
- springmvc无法通过@ResponseBody返回json问题解决
- SpringMVC @ResponseBody 返回json date 转换
- linux 修改启动脚本导致的错误:not a valid identifier
- 四月计划
- android sdk 文件目录含义介绍
- 记录EditText获取焦点后无法编辑 的解决方案
- extjs使用OpenLayer3
- springmvc @ResponseBody 返回json数据错误
- Android4.4的init进程详解
- 反射---基础方法概要笔记
- ProgressBar的简单用法
- java运算符(++运算和+=运算)
- 关于vb 多任意数字大小排列问题
- 1047. 编程团体赛(20)
- oracle10g,提示tns:无监听程序的问题解决
- 数据结构与算法概述