真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何解決FastJson中"$ref重復(fù)引用"的問(wèn)題

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

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到方城網(wǎng)站設(shè)計(jì)與方城網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類(lèi)型包括:網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名與空間、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋方城地區(qū)。

解決FastJson中"$ref重復(fù)引用"的問(wèn)題,先來(lái)看一個(gè)例子吧:

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 users = Lists.newArrayList();

 public UserGroup addUser(User user) {
  this.getUsers().add(user);
  return this;
 }
}

輸出結(jié)果:

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

上面的現(xiàn)象就是將user對(duì)象的引用重復(fù)使用造成了重復(fù)引用問(wèn)題,F(xiàn)astjson默認(rèn)開(kāi)啟引用檢測(cè)將相同的對(duì)象寫(xiě)成引用的形式:

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

目前來(lái)說(shuō),前端還沒(méi)有一個(gè)很好的辦法來(lái)解析這樣的JSON格式。

除了上面的重復(fù)引用外, 還衍生出了另外一個(gè)概念:"循環(huán)引用",下面來(lái)看下兩者之間的區(qū)別吧:

  • 重復(fù)引用:指一個(gè)對(duì)象引用重復(fù)出現(xiàn)多次

  • 循環(huán)引用:對(duì)象A引用對(duì)象B,對(duì)象B引用對(duì)象A(這種情況一般是個(gè)雷區(qū),輕易不要嘗試的好,很容易引發(fā)StackOverflowError)

再來(lái)看一個(gè)循環(huán)引用的例子:

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"}}

解決方案

關(guān)閉FastJson引用檢測(cè)機(jī)制(慎用,循環(huán)引用時(shí)可能導(dǎo)致StackOverflowError)

JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect)

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

避免一個(gè)對(duì)象引用被重復(fù)使用多次(使用拷貝的對(duì)象副本來(lái)完成JSON數(shù)據(jù)填充)

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));
}

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“如何解決FastJson中"$ref重復(fù)引用"的問(wèn)題”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!


新聞名稱(chēng):如何解決FastJson中"$ref重復(fù)引用"的問(wèn)題
文章地址:http://weahome.cn/article/pcjgso.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部