91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決FastJson中"$ref重復引用"的問題

發布時間:2021-07-21 13:48:07 來源:億速云 閱讀:246 作者:小新 欄目:編程語言

這篇文章主要介紹了如何解決FastJson中"$ref重復引用"的問題,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

解決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
@AllArgsConstructor
static 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));
}

感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何解決FastJson中"$ref重復引用"的問題”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江津市| 如皋市| 东丽区| 鹤峰县| 简阳市| 安远县| 南投县| 怀集县| 绥化市| 东平县| 钦州市| 吉木萨尔县| 普陀区| 资源县| 锦屏县| 襄汾县| 祁门县| 襄樊市| 安化县| 甘泉县| 萨嘎县| 桃园市| 福海县| 若羌县| 时尚| 永胜县| 芷江| 铁岭市| 调兵山市| 镇宁| 望谟县| 江津市| 铜山县| 叶城县| 永康市| 通州区| 漯河市| 双辽市| 佛冈县| 贡嘎县| 尚义县|