fastjson WriteNullStringAsEmpty 与WriteMapNullValue结合,不生效

8cdiaqws  于 4个月前  发布在  其他
关注(0)|答案(5)|浏览(38)

版本:1.2.56
SerializerFeature.WriteMapNullValue,// 显示空字段
SerializerFeature.WriteNullListAsEmpty,// List类型字段为null时输出[]而非null
SerializerFeature.WriteNullStringAsEmpty,// 字符串类型字段为null时输出""而非null

这3个结合不生效呀?null还是null,没有输出""

场景:
在配置spring boot的mvc输出时这样使用:

`@override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);

//1.定义一个消息转换对象convert
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();

//2.添加fastJson配置信息,是否需要格式化
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
        SerializerFeature.DisableCircularReferenceDetect,// 禁用循环引用检测
        SerializerFeature.WriteMapNullValue,// 显示空字段
        SerializerFeature.WriteNullListAsEmpty,// List类型字段为null时输出[]而非null
        SerializerFeature.WriteNullStringAsEmpty,// 字符串类型字段为null时输出""而非null
        SerializerFeature.WriteNullNumberAsZero,// 数值字段如果为null,输出为0,而非null
        SerializerFeature.WriteNullBooleanAsFalse// Boolean类型字段为null时输出false而null
);

//3.在convert添加配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);

//处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.ALL);
fastMediaTypes.add(MediaType.APPLICATION_JSON);
fastMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);

fastMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
fastMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
fastMediaTypes.add(MediaType.APPLICATION_PDF);
fastMediaTypes.add(MediaType.APPLICATION_RSS_XML);
fastMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
fastMediaTypes.add(MediaType.APPLICATION_XML);
fastMediaTypes.add(MediaType.IMAGE_GIF);
fastMediaTypes.add(MediaType.IMAGE_JPEG);
fastMediaTypes.add(MediaType.IMAGE_PNG);
fastMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
fastMediaTypes.add(MediaType.TEXT_HTML);
fastMediaTypes.add(MediaType.TEXT_MARKDOWN);
fastMediaTypes.add(MediaType.TEXT_PLAIN);
fastMediaTypes.add(MediaType.TEXT_XML);

fastConverter.setSupportedMediaTypes(fastMediaTypes);

//4.将convert添加到converters中
converters.add(fastConverter);

}`

然后出现前面提到的,WriteNullStringAsEmpty 与WriteMapNullValue结合,不生效
这个是spring的组件FastJsonHttpMessageConverter的问题,单元测试不好写。

icnyk63a

icnyk63a1#

最好写个单元测试,这样文字描述比较抽象

cngwdvgl

cngwdvgl2#

场景:
在配置spring boot的mvc输出时这样使用:

`@override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);

//1.定义一个消息转换对象convert
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();

//2.添加fastJson配置信息,是否需要格式化
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
        SerializerFeature.DisableCircularReferenceDetect,// 禁用循环引用检测
        SerializerFeature.WriteMapNullValue,// 显示空字段
        SerializerFeature.WriteNullListAsEmpty,// List类型字段为null时输出[]而非null
        SerializerFeature.WriteNullStringAsEmpty,// 字符串类型字段为null时输出""而非null
        SerializerFeature.WriteNullNumberAsZero,// 数值字段如果为null,输出为0,而非null
        SerializerFeature.WriteNullBooleanAsFalse// Boolean类型字段为null时输出false而null
);

//3.在convert添加配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);

//处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.ALL);
fastMediaTypes.add(MediaType.APPLICATION_JSON);
fastMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);

fastMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
fastMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
fastMediaTypes.add(MediaType.APPLICATION_PDF);
fastMediaTypes.add(MediaType.APPLICATION_RSS_XML);
fastMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
fastMediaTypes.add(MediaType.APPLICATION_XML);
fastMediaTypes.add(MediaType.IMAGE_GIF);
fastMediaTypes.add(MediaType.IMAGE_JPEG);
fastMediaTypes.add(MediaType.IMAGE_PNG);
fastMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
fastMediaTypes.add(MediaType.TEXT_HTML);
fastMediaTypes.add(MediaType.TEXT_MARKDOWN);
fastMediaTypes.add(MediaType.TEXT_PLAIN);
fastMediaTypes.add(MediaType.TEXT_XML);

fastConverter.setSupportedMediaTypes(fastMediaTypes);

//4.将convert添加到converters中
converters.add(fastConverter);

}`

然后出现前面提到的,WriteNullStringAsEmpty 与WriteMapNullValue结合,不生效
这个是spring的组件FastJsonHttpMessageConverter的问题,单元测试不好写。

e7arh2l6

e7arh2l63#

@cnhans 你是不是指 Map 中的 null 序列化的时候还是 null,没有生成 ""

sgtfey8w

sgtfey8w5#

@cnhans

  • 因为 Map 是泛型擦除的.所以在序列化的时候并不能确定 null 值应该是否为字符串类型,所以 null 不序列化为 "" 也情有可原.
  • 另一个比较重要的原因. 假设非 null 的情况下,该值为非字符串类型,例如 Map 或 List .恰好反序列化用 bean 的方式接收. 而当值为 null 的时候如果序列化为 "" ,会导致反序列化失败.

相关问题