JSONObject.put()顺序错乱问题+put对象为引用地址出现$ref解决

1.JSONObject.put()顺序错乱问题

网上解决方案:JSONObject按put顺序排放与输出_object.put-CSDN博客

今天在使用fastjson的JSONObject时,在put数据之后发生数据错乱问题

JSONObject jsonObject1 = new JSONObject();

问题原因:因为JsonObject内部是用Hashmap来存储的,所以输出是按key的排序来的,如果要让JsonObject按固定顺序(put的顺序)排列,可以修改JsonObject的定义HashMap改为LinkedHashMap。

 JSONObject jsonObject1 = new JSONObject(new LinkedHashMap());

 2.put对象为引用地址出现$ref解决

我们在put时是能看见正常的数据,但是使用JSON.toJSONString(String,Object)方法时value值变成了引用类型

网上解决方案:java使用FastJson封装数据出现$ref解决_java $ref-CSDN博客

原因——我的理解
是FastJson在对集合对象进行添加的时候,对于引用重复的某一快内存地址,默认开启了Fastjson 循环引用。

说白了,就是你的集合对象中,有一部分对象的属性。其值是一样的,比如我的List中有多个UserVo对象都有一个相同的String类型的deptName值,那么FastJson对于这部分相同的引用地址直接展示出引用了,而不是展示其值。

解决
知道了问题,就好解决了,别管别人怎么说,直接看官网文档的给的解决办法最踏实、最保险。

官方提供了两个办法:一个全局,一个局部

那我们直接在我们代码中操作方法即可:

先搞全局的 ——方法1

直接在项目创建一个FastJson的配置类,全局关闭FastJson的循环引用

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.springframework.context.annotation.Configuration;
/**
*@Description 配置FastJson
*@Author
*@Date 2020/11/9
*@Version 1.0
*/
@Configuration
public class FastJsonConfig {
    static {
        //全局配置关闭 Fastjson 循环引用
        JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
    }
}

再试一下局部的——方法二

		//直接在 list对象填充到json对象之前定义这行就行了
        JSON.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect);
        jsonObject.put("code",200);
        jsonObject.put("isSuccess",true);
        jsonObject.put("data",list);

结果:

我分别试了上面的两种,多次测试,发现局部的有时候不管用,我没找到原因
全局的测试每次都OK
推荐使用全局的

另外,发现用postman测试接口的时候 ,不会出现$ref的问题,但是浏览器是会出现的

注:我是存储在数据库的没有出现类型该博主的错误

最后附上我的代码

        dto.setOptional(true);
        if (dto.getOptional()){
            // 通过type类型查询所有数据
            JSONObject jsonObject = JSONObject.parseObject(cnyStencilOperationList.get(0).getJson());
            // 数据库存储的数据 使用LinkedHashMap解决JSONObject.put方法顺序错乱问题
            JSONObject jsonObject1 = new JSONObject(new LinkedHashMap());
            for (String type : dto.getType()) {
                Set<String> names = new HashSet<>();
                for (String v : jsonObject.keySet()) {
                    JSONObject jsonObject2 = jsonObject.getJSONObject(v);
                    //  判断type类型是否相同
                    if (type.equals(jsonObject2.getString("type"))){
                    String name = jsonObject2.getString("name");
                    names.add(name);
                    }
                }

                if (names.isEmpty()){
                    continue;
                }
                List<SelectDataVo> selectDataVos = cnyDeviceMapper.listAllByType(type, names);
                // 设置JSON数据,json格式与前端相同
                AtomicInteger num = new AtomicInteger();
                selectDataVos.forEach(selectDataVo -> {
                    Map<String, Object> map = new LinkedHashMap<>();
                    map.put("device",selectDataVo.getEquipmentId());
                    map.put("deviceName",selectDataVo.getEquipmentName());
                    map.put("name",selectDataVo.getMeasuringPointName());
                    map.put("type",type);
                    map.put("num", num.getAndIncrement());
                    jsonObject1.put(selectDataVo.getTelemetryCode(),map);
                });
            }
            // 使用SerializerFeature.DisableCircularReferenceDetect避免出现$ref
            cnyStencilOperation.setJson(JSON.toJSONString(jsonObject1, SerializerFeature.DisableCircularReferenceDetect));
        }

  • 48
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值