解决json序列化有多对一和多对多关系的对象时造成死循环的问题

json序列化的对象中存在双向引用会导致的无限递归(infinite recursion)问题。

使用@JsonBackReference标记在有多对一或者多对多关系的属性上即可解决这个问题,举例:
@JsonBackReference
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "market_id")
private Market market;
 
 
ps:
@JsonManagedReference:标记的属性会被序列化,序列化时属性默认都是会被序列化的。反序列(deserialization,即json数据转换为对象)时,如果没有@JsonManagedReference,则不会自动注入@JsonBackReference标注的属性。
@JsonIgnore:直接忽略某个属性,以断开无限递归,序列化或反序列化均忽略。当然如果标注在get、set方法中,则可以分开控制,序列化对应的是get方法,反序列化对应的是set方法。在父子关系中,当反序列化时,@JsonIgnore不会自动注入被忽略的属性值(父或子),这是它跟@JsonBackReference和@JsonManagedReference最大的区别。 
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对象json序列化是将一个对象转换为json字符串的过程,而json序列化是将json字符串转换回对象的过程。 在大多数编程语言中,有现成的库或函数可以实现对象json字符串的序列化和反序列化操作。以下是一些常见的示例: Python: - 序列化:使用`json.dumps()`函数将对象转换为json字符串。 ```python import json data = {"name": "John", "age": 30} json_str = json.dumps(data) print(json_str) # 输出: {"name": "John", "age": 30} ``` - 反序列化:使用`json.loads()`函数将json字符串转换为对象。 ```python import json json_str = '{"name": "John", "age": 30}' data = json.loads(json_str) print(data["name"]) # 输出: John print(data["age"]) # 输出: 30 ``` Java: - 序列化:使用Jackson、Gson等库将对象转换为json字符串。 ```java import com.fasterxml.jackson.databind.ObjectMapper; public class Person { private String name; private int age; // getters and setters public static void main(String[] args) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); Person person = new Person(); person.setName("John"); person.setAge(30); String json = objectMapper.writeValueAsString(person); System.out.println(json); // 输出: {"name":"John","age":30} } } ``` - 反序列化:使用Jackson、Gson等库将json字符串转换为对象。 ```java import com.fasterxml.jackson.databind.ObjectMapper; public class Person { private String name; private int age; // getters and setters public static void main(String[] args) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); String json = "{\"name\":\"John\",\"age\":30}"; Person person = objectMapper.readValue(json, Person.class); System.out.println(person.getName()); // 输出: John System.out.println(person.getAge()); // 输出: 30 } } ``` 这只是两种常见编程语言的示例,其他编程语言也有相应的库或函数可用于对象json序列化和反序列化。具体使用方法请参考对应编程语言的文档或教程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值