欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2018年11月30日 11:22:31   作者:吳汶澤  
這篇文章主要介紹了解決FastJson中"$ref重復(fù)引用"的問(wèn)題方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

解決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<User> 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]"}]}

<!--- more --->

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

{"$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));
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring中Bean的生命周期及實(shí)例化操作詳解

    Spring中Bean的生命周期及實(shí)例化操作詳解

    這篇文章主要介紹了Spring中Bean的生命周期及實(shí)例化操作詳解,spring的核心思想之一IOC就是通過(guò)IOC容器對(duì)Bean的創(chuàng)建和各個(gè)bean之間的依賴關(guān)系進(jìn)行操作,今天就來(lái)和大家分享一下bean的生命周期相關(guān)知識(shí)點(diǎn),需要的朋友可以參考下
    2023-08-08
  • springboot實(shí)現(xiàn)在工具類(util)中調(diào)用注入service層方法

    springboot實(shí)現(xiàn)在工具類(util)中調(diào)用注入service層方法

    這篇文章主要介紹了springboot實(shí)現(xiàn)在工具類(util)中調(diào)用注入service層方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • springboot yml中profiles的巧妙用法(小白必看多環(huán)境配置)

    springboot yml中profiles的巧妙用法(小白必看多環(huán)境配置)

    這篇文章主要介紹了springboot yml中profiles的巧妙用法,非常適合多環(huán)境配置場(chǎng)景,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Elasticsearch聚合查詢概念及字段類型示例

    Elasticsearch聚合查詢概念及字段類型示例

    這篇文章主要為大家介紹了Elasticsearch聚合查詢概念及字段類型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Java中Stream流中map和forEach的區(qū)別詳解

    Java中Stream流中map和forEach的區(qū)別詳解

    本文主要介紹了Java中Stream流中map和forEach的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 啟動(dòng)springboot應(yīng)用因未配置數(shù)據(jù)庫(kù)報(bào)錯(cuò)的解決方案

    啟動(dòng)springboot應(yīng)用因未配置數(shù)據(jù)庫(kù)報(bào)錯(cuò)的解決方案

    這篇文章主要介紹了啟動(dòng)springboot應(yīng)用因未配置數(shù)據(jù)庫(kù)報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java經(jīng)典算法匯總之順序查找(Sequential Search)

    Java經(jīng)典算法匯總之順序查找(Sequential Search)

    Java查找算法之順序查找說(shuō)明:順序查找適合于存儲(chǔ)結(jié)構(gòu)為順序存儲(chǔ)或鏈接存儲(chǔ)的線性表。 下面我們來(lái)詳細(xì)說(shuō)明下
    2016-04-04
  • Java使用list集合remove需要注意的事項(xiàng)(使用示例)

    Java使用list集合remove需要注意的事項(xiàng)(使用示例)

    List集合的一個(gè)特點(diǎn)是它其中的元素是有序的,也就是說(shuō)元素的下標(biāo)是根據(jù)插入的順序來(lái)的,在刪除頭部或者中間的一個(gè)元素后,后面的元素下標(biāo)會(huì)往前移動(dòng),本文給大家介紹Java使用list集合remove需要注意的事項(xiàng),感興趣的朋友一起看看吧
    2022-01-01
  • SpringCloud?OpenFeign?服務(wù)調(diào)用傳遞?token的場(chǎng)景分析

    SpringCloud?OpenFeign?服務(wù)調(diào)用傳遞?token的場(chǎng)景分析

    這篇文章主要介紹了SpringCloud?OpenFeign?服務(wù)調(diào)用傳遞?token的場(chǎng)景分析,本篇文章簡(jiǎn)單介紹?OpenFeign?調(diào)用傳遞?header?,以及多線程環(huán)境下可能會(huì)出現(xiàn)的問(wèn)題,其中涉及到?ThreadLocal?的相關(guān)知識(shí),需要的朋友可以參考下
    2022-07-07
  • Java面試題沖刺第七天--Spring框架1

    Java面試題沖刺第七天--Spring框架1

    這篇文章主要為大家分享了最有價(jià)值的三道Spring框架面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評(píng)論