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