麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > Java > 正文

解決FastJson中"$ref重復引用"的問題方法

2024-07-14 08:42:59
字體:
來源:轉載
供稿:網友

解決FastJson中"$ref重復引用"的問題,先來看一個例子吧:

public static void main(String[] args) { UserGroup userGroup = new UserGroup().setName("UserGroup"); User user = new User("User"); for (int i = 0; i < 3; i++) {  userGroup.addUser(user); } Console.log(JSON.toJSONString(userGroup));}@Data@AllArgsConstructorstatic class User { private String name;}@Data@Accessors(chain = true)static class UserGroup { private String name; private List<User> users = Lists.newArrayList(); public UserGroup addUser(User user) {  this.getUsers().add(user);  return this; }}

輸出結果:

{"name":"UserGroup","users":[{"name":"User"},{"$ref":"$.users[0]"},{"$ref":"$.users[0]"}]}

<!--- more --->

上面的現象就是將user對象的引用重復使用造成了重復引用問題,Fastjson默認開啟引用檢測將相同的對象寫成引用的形式:

{"$ref": "$"} // 引用根對象{"$ref":"@"} // 引用自己{"$ref":".."} // 引用父對象{"$ref":"../.."} // 引用父對象的父對象{"$ref":"$.members[0].reportTo"} // 基于路徑的引用

目前來說,前端還沒有一個很好的辦法來解析這樣的JSON格式。

除了上面的重復引用外, 還衍生出了另外一個概念:"循環引用",下面來看下兩者之間的區別吧:

  • 重復引用:指一個對象引用重復出現多次
  • 循環引用:對象A引用對象B,對象B引用對象A(這種情況一般是個雷區,輕易不要嘗試的好,很容易引發StackOverflowError)

再來看一個循環引用的例子:

public static void main(String[] args) { Order order = new Order().setName("Order"); Item item = new Item().setName("Item"); item.setOrder(order); order.setItem(item); Console.log(JSON.toJSONString(order)); Console.log("----------------------------"); Console.log(JSON.toJSONString(item));}@Data@Accessors(chain = true)static class Order { private String name; private Item item;}@Data@Accessors(chain = true)static class Item { private String name; private Order order;}

{"item":{"name":"Item","order":{"$ref":".."}},"name":"Order"}
----------------------------
{"name":"Item","order":{"item":{"$ref":".."},"name":"Order"}}

解決方案

關閉FastJson引用檢測機制(慎用,循環引用時可能導致StackOverflowError)

JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect)

避免循環引用(某一方的引用字段不參與序列化:@JSONField(serialize=false))

避免一個對象引用被重復使用多次(使用拷貝的對象副本來完成JSON數據填充)

public static void main(String[] args) { UserGroup userGroup = new UserGroup().setName("UserGroup"); User user = new User("User"); for (int i = 0; i < 3; i++) {  User duplicateUser = new User();  BeanUtil.copyProperties(user, duplicateUser);  userGroup.addUser(duplicateUser); } Console.log(JSON.toJSONString(userGroup));}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 91精品欧美一区二区三区 | 姑娘第5集高清在线观看 | 成人免费观看49www在线观看 | 精品一区二区免费 | 国产精品久久国产精品 | 免费放黄网站在线播放 | 久久人人av | 成人福利视频在线观看 | 日本中文字幕久久 | 久久久久久久久久亚洲精品 | 精品一区二区久久久久久久网精 | 国产精品久久久久久久久久了 | 久久最新免费视频 | 久久污| 黄色毛片视频在线观看 | 视频一区二区三区在线播放 | 7777欧美| 香蕉久草视频 | 欧美激情性色生活片在线观看 | 欧美视频网 | 亚洲成人黄色片 | 日韩一级成人 | 性 毛片 | 国产免费一区 | 久久影院国产精品 | 日韩视频一区二区三区在线观看 | 日韩欧美电影在线观看 | 国产午夜精品一区二区三区嫩草 | 免费观看国产精品视频 | 欧美成年人在线视频 | 97人操 | 日韩精品中文字幕在线播放 | 蜜桃网站在线 | av成人一区二区 | 成人一级免费视频 | 激情亚洲一区二区 | 成年人精品视频 | 男人的天堂色偷偷 | 国产人成免费爽爽爽视频 | 最新一区二区三区 | 久久久麻豆 |