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

}
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]"}
为什么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);
如果使用的是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
}
其中,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);
在使用 toJSONString() 方法时,将 SerializerFeature.DisableCircularReferenceDetect 作为第二个参数传入,即可关闭引用检测。

你可能感兴趣的:(ChatGPT,chatgpt,json)