• ChatGPT:使用FastJSON库关闭JSON引用检测的方法


    ChatGPT:使用FastJSON库关闭JSON引用检测的方法



    下面我将输入一个方法,请你记住:
    ChatGPT:
    好的,请输入方法。

    @RequestMapping("/getLianZhengLabels")
    public String getLianZhengLabels() {
    
        HashMap<String, Object> res = new HashMap<>();
        List<HashMap<String, Object>> hashMaps = new ArrayList<>();
    
        QueryWrapper<Label> wrapper1 = new QueryWrapper<>();
        wrapper1.orderByAsc("l_id");
        wrapper1.eq("l_level", 0);
        List<Label> firstLabels = labelMapper.selectList(wrapper1);
    
        QueryWrapper<Label> wrapper2 = new QueryWrapper<>();
        wrapper2.orderByAsc("l_id");
        wrapper2.eq("l_level", 1);
        List<Label> secondLabels = labelMapper.selectList(wrapper2);
    
        QueryWrapper<Label> wrapper3 = new QueryWrapper<>();
        wrapper3.orderByAsc("l_id");
        wrapper3.eq("l_level", 2);
        List<Label> thirdLabels = labelMapper.selectList(wrapper3);
    
        for (Label firstLabel : firstLabels) {
    
            HashMap<String, Object> firstMap = new HashMap<>();
            firstMap.put("value", firstLabel.getL_text());
            firstMap.put("label", firstLabel.getL_text());
    
            List<HashMap<String, Object>> firstChildren = new ArrayList<>();
    
            for (Label secondLabel : secondLabels) {
    
                if (secondLabel.getL_parent_id().equals(firstLabel.getL_id())) {
    
                    HashMap<String, Object> secondMap = new HashMap<>();
                    secondMap.put("value", secondLabel.getL_text());
                    secondMap.put("label", secondLabel.getL_text());
    
                    List<HashMap<String, Object>> secondChildren = new ArrayList<>();
    
                    for (Label thirdLabel : thirdLabels) {
    
                        if (thirdLabel.getL_parent_id().equals(secondLabel.getL_id())) {
    
                            HashMap<String, Object> thirdMap = new HashMap<>();
                            thirdMap.put("value", thirdLabel.getL_text());
                            thirdMap.put("label", thirdLabel.getL_text());
    
                            secondChildren.add(thirdMap);
    
                        }
    
                    }
    
                    secondMap.put("children", secondChildren);
                    firstChildren.add(secondMap);
    
                }
    
            }
    
            firstMap.put("children", firstChildren);
            hashMaps.add(firstMap);
    
        }
    
        List<HashMap<String, Object>> em_tags = new ArrayList<>();
        List<HashMap<String, Object>> ad_tags = new ArrayList<>();
        List<HashMap<String, Object>> di_tags = new ArrayList<>();
        List<HashMap<String, Object>> in_tags = new ArrayList<>();
        List<HashMap<String, Object>> ma_tags = new ArrayList<>();
    
        for (HashMap<String, Object> item : hashMaps) {
    
            if (item.get("label").equals("职务")) {
                em_tags.add(item);
                ad_tags.add(item);
                di_tags.add(item);
            }
    
            if (item.get("label").equals("基本信息")) {
                em_tags.add(item);
                ad_tags.add(item);
                di_tags.add(item);
                ma_tags.add(item);
            }
    
            if (item.get("label").equals("金融消费")) {
                in_tags.add(item);
            }
    
            if (item.get("label").equals("资产")) {
                in_tags.add(item);
            }
    
            if (item.get("label").equals("行为轨迹")) {
                in_tags.add(item);
            }
    
            if (item.get("label").equals("社交网络")) {
                in_tags.add(item);
            }
    
        }
    
        res.put("tags", hashMaps);
        res.put("em_tags", em_tags);
        res.put("ad_tags", ad_tags);
        res.put("di_tags", di_tags);
        res.put("in_tags", in_tags);
        res.put("ma_tags", ma_tags);
        return JSON.toJSONString(res);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    ChatGPT:
    好的,我已经记录下了这段代码。这是一个使用Spring MVC框架中的@RequestMapping注解定义的控制器方法,其作用是获取标签信息。该方法使用了MyBatis-Plus提供的QueryWrapper构造器来构造查询条件,查询数据库中不同层级的标签列表。然后通过嵌套循环,将查询结果整理成一个层级嵌套的HashMap对象,最后返回一个JSON格式的字符串。在整理过程中,还根据标签的不同类型将其分类存储到不同的List中。

    这段代码的输出结果
    "ad_tags":[{"children":[{"children":[{"label":"金融","value":"金融"}"em_tags":[{"$ref":"$.ad_tags[0]"},{"$ref":"$.ad_tags[1]"}
    • 1
    为什么ad_tags和em_tags不一样
    ChatGPT:
    根据代码中的逻辑和输出结果,可以看出这个问题是由于在循环整理标签信息的过程中,对不同类型的标签进行了不同的处理所导致的。
    具体来说,ad_tags、di_tags和em_tags这三个List对象在循环整理标签信息的过程中都被添加了同样的元素,即职务和基本信息这两个标签。而ma_tags则只包含基本信息这个标签。而in_tags则只包含金融消费、资产、行为轨迹和社交网络这些标签。这些元素的添加方式是通过遍历整理好的hashMaps List对象来实现的。
    由于在整理标签信息时,将hashMaps中的元素按照标签类型添加到了不同的List中,因此当在输出结果中引用em_tags时,其中包含了ad_tags和di_tags中的内容,而ma_tags和in_tags则与这三个List没有任何关系。这也是输出结果中em_tags和ad_tags不一样的原因。
    需要注意的是,输出结果中的"$ref"属性是JSON中的引用类型,用于引用JSON中已经存在的数据。在这个例子中,“$ref”:“$.ad_tags[0]“表示该元素引用了ad_tags中的第一个元素,”$ref”:"$.ad_tags[1]"表示该元素引用了ad_tags中的第二个元素。这种引用方式可以减少JSON的重复,提高数据的利用效率。

    怎么能关闭这种引用方式
    ChatGPT:
    在这段代码中,使用了JSON库将Java对象转换为JSON字符串。默认情况下,JSON库会检测并尝试去除重复的对象,将其转换为一个引用,以减小JSON字符串的大小。这种引用方式在某些情况下可能会导致问题,因此可以通过设置JSON库的配置选项来关闭它。
    具体而言,如果使用的是FastJSON库,可以通过设置SerializerFeature.DisableCircularReferenceDetect选项来关闭引用检测,如下所示:
    JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);
    
    • 1
    如果使用的是Jackson库,可以通过在对象的属性上添加@JsonIdentityInfo注解来指定引用的生成方式,如下所示:
    @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
    public class MyClass {
        private int id;
        private MyClass parent;
        private List<MyClass> children;
        // getters and setters
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    其中,generator参数指定了引用的生成方式,这里使用了PropertyGenerator,它将根据对象的id属性来生成引用。property参数指定了对象的标识属性名,即id。
    总之,具体要如何关闭引用方式,取决于所使用的JSON库和具体的使用场景。

    我使用的是com.alibaba.fastjson
    ChatGPT:
    如果你使用的是 Alibaba FastJSON 库,则可以使用以下方法关闭引用检测:
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.serializer.SerializerFeature;
    
    // ...
    
    String jsonString = JSON.toJSONString(yourObject, SerializerFeature.DisableCircularReferenceDetect);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    在使用 toJSONString() 方法时,将 SerializerFeature.DisableCircularReferenceDetect 作为第二个参数传入,即可关闭引用检测。

  • 相关阅读:
    2022年合肥市蜀山区信息学区赛(小学组)
    Cortex-M3如何跳出BusFault,跳过出错代码,程序往下执行
    深度神经网络主要模型,神经网络模型参数辨识
    探索古彝文的秘密,AI实现古籍传承
    什么是Docker
    NMS技术总结(NMS原理、多类别NMS、NMS的缺陷、NMS的改进思路、各种NMS方法)
    k-NN分类算法详解与分析(k近邻分类算法)
    JAVA JDBC使用PreparedStatement实现CRUD操作
    小程序自定义tabbar如何显示隐藏
    C语言 基础开发----目录
  • 原文地址:https://blog.csdn.net/XRT_knives/article/details/133363764