zoukankan      html  css  js  c++  java
  • 解决FastJson中"$ref重复引用"的问题方法

    对象的引用重复使用造成了重复引用问题,Fastjson默认开启引用检测将相同的对象写成引用的形式:

    1
    2
    3
    4
    5
    {"$ref": "$"} // 引用根对象
    {"$ref":"@"} // 引用自己
    {"$ref":".."} // 引用父对象
    {"$ref":"../.."} // 引用父对象的父对象
    {"$ref":"$.members[0].reportTo"} // 基于路径的引用

    目前来说,前端还没有一个很好的办法来解析这样的JSON格式。

    除了上面的重复引用外, 还衍生出了另外一个概念:"循环引用",下面来看下两者之间的区别吧:

    • 重复引用:指一个对象引用重复出现多次
    • 循环引用:对象A引用对象B,对象B引用对象A(这种情况一般是个雷区,轻易不要尝试的好,很容易引发StackOverflowError)

    我的代码就出现了循环引用的问题,尝试了关闭循环引用,

    关闭FastJson引用检测机制(慎用,循环引用时可能导致StackOverflowError)

    JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect)

    抛出一大堆异常。

    百度第二种方式:

    避免循环引用(某一方的引用字段不参与序列化:@JSONField(serialize=false))

    没弄明白json数据明显没了啊

    最终我用了这种方式做的:

    Tree tree = new Tree(genOrgList());

    TreeNode treeNode = tree.getTreeNode("2");

    SimplePropertyPreFilter filter = new SimplePropertyPreFilter();

    // 构造方法里,也可以直接传需要序列化的属性名字 f

    ilter.getExcludes().add("parent");

    filter.getExcludes().add("allChildren");

    String data = JSONObject.toJSONString(treeNode, filter);

    System.out.println(data);

  • 相关阅读:
    [bzoj4131]并行博弈_博弈论
    [bzoj1874][BeiJing2009 WinterCamp]取石子游戏_博弈论
    [bzoj4281][ONTAK2015]Związek Harcerstwa Bajtockiego_倍增LCA
    [bzoj2091][Poi2010]The Minima Game_动态规划
    [bzoj1578][Usaco2009 Feb]Stock Market 股票市场_完全背包dp
    常用正则表达式
    webSQL的基本操作
    《css3揭秘》的效果code
    笛卡尔积算法的sku
    仿制淘宝sku点击效果
  • 原文地址:https://www.cnblogs.com/q1359720840/p/13843617.html
Copyright © 2011-2022 走看看