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

  • 相关阅读:
    [HEOI2016/TJOI2016]树
    luogu P4198 楼房重建
    [USACO11DEC]Umbrellas for Cows
    luogu P2700 逐个击破
    一、MegaCli命令介绍
    dmidecode -t1 | egrep "Manufacturer|Product Name"
    IPMITOOL常用操作指令V1.0
    CentOS 7上的性能监控工具
    Could not open device at /dev/ipmi0
    n95医用口罩(常见型号1860 或者9132)防水无呼吸阀
  • 原文地址:https://www.cnblogs.com/q1359720840/p/13843617.html
Copyright © 2011-2022 走看看