山东网站营销seo哪家好,哈尔滨网络推广经理招聘,对其网站建设进行了考察调研,北京城乡建设网站1、场景
在日常的开发中#xff0c;我们数据接口返回数据使用了FastJson序列化数据#xff0c;当返回一个数据list时候出现 r e f ref ref.data 等类似乱码一样的数据#xff0c;当时我比较匪夷所思#xff0c;我写…1、场景
在日常的开发中我们数据接口返回数据使用了FastJson序列化数据当返回一个数据list时候出现 r e f ref ref.data 等类似乱码一样的数据当时我比较匪夷所思我写的代码这么完美为什么会返回非正常数据数据呢经过我多方查证原来是FastJson框架自身的问题。
2、问题原因
使用FastJson的JSONArray类型作为返回数据当像JSONArray对象中添加JSONObject对象而JSONObject对象中包含相同的节点数据时FastJson会防止返回数据栈溢出的问题自动将JSONArray中相同的节点数据使用引用方式代替即{ r e f : ref: ref:…[0]}
3、解决方案
强大的 FastJson 为我们提供了相关的配置参数来禁用循环引用
方法一使用配置文件
*** FastJson配置** author charles.yao* date 2023/8/8**/
Configuration
public class FastJsonConfiguration {Beanpublic HttpMessageConverters getFastJSONHttpMessageConvert() {// 定义一个转换消息的对象FastJsonHttpMessageConverter fastConverter new FastJsonHttpMessageConverter();// 添加fastjson的配置信息 比如 是否要格式化返回的json数据FastJsonConfig fastJsonConfig new FastJsonConfig();// 修改配置返回内容的过滤fastJsonConfig.setSerializerFeatures(// 格式化输出SerializerFeature.PrettyFormat,// 消除循环引用SerializerFeature.DisableCircularReferenceDetect,// 返回结果保留null值SerializerFeature.WriteMapNullValue,// 将返回值为null的字符串转变成,在这里可以自己设置SerializerFeature.WriteNullStringAsEmpty,// List字段如果为null,输出为[],而非nullSerializerFeature.WriteNullListAsEmpty);// 解决 SerializerFeature.WriteNullStringAsEmpty 不生效问题ValueFilter valueFilter (object, name, value) - {if (null value){value ;}return value;};// 设置全局日期格式fastJsonConfig.setDateFormat(yyyy-MM-dd HH:mm:ss);// 注入过滤器fastJsonConfig.setSerializeFilters(valueFilter);// Long、BigDecimal 序列化时转 StringSerializeConfig serializeConfig SerializeConfig.globalInstance;serializeConfig.put(Long.class, ToStringSerializer.instance);serializeConfig.put(Long.TYPE, ToStringSerializer.instance);serializeConfig.put(BigDecimal.class, ToStringSerializer.instance);// 在转换器中添加配置信息fastJsonConfig.setSerializeConfig(serializeConfig);fastConverter.setDefaultCharset(StandardCharsets.UTF_8);fastConverter.setFastJsonConfig(fastJsonConfig);// 解决中文乱码问题相当于在Controller上的RequestMapping中加了个属性produces application/jsonListMediaType mediaTypeList new ArrayList();mediaTypeList.add(MediaType.APPLICATION_JSON);fastConverter.setSupportedMediaTypes(mediaTypeList);return new HttpMessageConverters(fastConverter);}
}所有可选配置属性
SerializerFeature.PrettyFormat格式化输出SerializerFeature.WriteMapNullValue是否输出值为null的字段,默认为falseSerializerFeature.DisableCircularReferenceDetect消除循环引用SerializerFeature.WriteNullStringAsEmpty将为null的字段值显示为WriteNullListAsEmptyList字段如果为null,输出为[],而非nullWriteNullNumberAsZero数值字段如果为null,输出为0,而非nullWriteNullBooleanAsFalseBoolean字段如果为null,输出为false,而非nullSkipTransientField如果是true类中的Get方法对应的Field是transient序列化时将会被忽略。默认为trueSortField按字段名称排序后输出。默认为falseWriteDateUseDateFormat全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);BeanToArray将对象转为array输出QuoteFieldNames输出key时是否使用双引号,默认为trueUseSingleQuotes输出key时使用单引号而不是双引号,默认为false经测试这里的key是指所有的输出结果而非key/value的key,而是key,和value都使用单引号或双引号输出
方法二直接在返回数据禁止循环引用
JSONArray jsonArrayUserNum JSONArray.parseArray(JSON.toJSONString(resultJsonArr, SerializerFeature.DisableCircularReferenceDetect));