oldwu's Blog - fastjson
type: channel
link: https://blog.oldwu.top/index.php/tag/fastjson/
items: Fastjson解析出来的JSONObject(map)没有按照原json排序的解决办法
items: 使用FastJson转将对象转为字符串时出现"$ref"的情况解决

Fastjson解析出来的JSONObject(map)没有按照原json排序的解决办法
type: item
date: 2022-10-10T21:57:14+08:00
description: Fastjson解析出来的JSONObject(map)没有按照原json排序的解决办法问题一个api返回了这样一个数据形式，请求这个api后，会用到其中的排序信息{ "state": "0", "success": true, "data": { "1": 55, "2": 81, "3": 39, "4": 45, "5": 54, "6": 24, "7": 70, "8": 106, "9": 72, "10": 32 } }使用如下代码，得到一个无序的的Map集合JSONObject res = JSON.parseObject(json); JSONObject data = res.getJSONObject("data");解决JSONObject res = JSON.parseObject(json, Feature.OrderedField); LinkedHashMap data = JSON.parseObject(res.getString("data"), LinkedHashMap.class);这样就得到一个有序Map集合

使用FastJson转将对象转为字符串时出现"$ref"的情况解决
type: item
date: 2022-07-01T16:01:22+08:00
description: 使用FastJson转将对象转为字符串时出现"$ref"的情况解决转Json发现业务执行有问题，打断点一看，转出来的json是这样的"files":[{"$ref":"$.formData.canWriteFiles.handwriting"},{"$ref":"$.formData.canWriteFiles.mainfile"}]主要是因为引用的内存对象重复才会出现这种情况FastJson对重复/循环引用的处理首先，fastjson作为一款序列化引擎，不可避免的会遇到循环引用的问题，为了避免StackOverflowError异常，fastjson会对引用进行检测。如果检测到存在重复/循环引用的情况，fastjson默认会以“引用标识”代替同一对象，而非继续循环解析导致StackOverflowError。解决办法避免重复引用内存对象，这当然是废话，直接看2吧局部关闭FastJson的引用检测JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);springboot全局关闭FastJson引用检测 public class FastJsonHttpMessageConverterEx extends FastJsonHttpMessageConverter{ public FastJsonHttpMessageConverterEx(){ //在这里配置fastjson特性(全局设置的) FastJsonConfig fastJsonConfig = new FastJsonConfig(); //fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); //自定义时间格式 //fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue); //正常转换null值 //fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect); //关闭循环引用 this.setFastJsonConfig(fastJsonConfig); } @Override protected boolean supports(Class<?> clazz) { return super.supports(clazz); } } @Configuration public class WebMvcConfigurer extends WebMvcConfigurerAdapter { ..... @Bean public FastJsonHttpMessageConverterEx fastJsonHttpMessageConverterEx(){ return new FastJsonHttpMessageConverterEx(); } }创建新的对象，避免内存地址相同// 创建新的对象 Object newObj = new Object(); // 使用org.springframework.beans.BeansUtils复制属性值 BeansUtils.copyProperties(obj, newObj);https://www.jianshu.com/p/6041242405e8