SpringBoot 默认使用 Jackson 作为默认的 JSON 解析库,如果用不习惯的话,可以非常方便地替换为自己喜欢的 JSON 库。
但是个人还是使用的 Jackson,一是减少依赖,二是 Spring 官方的认可。其他 JSON 库可能性能更胜一筹,但是用起来很多并没有 Jackson 好用。
来源:
配置
虽然可以通过 converters.clear()
的方式去除所有默认的转换器,但还是不要做太绝吧,不然非 application/json
的请求就无法解析了。
@Slf4j
@Configuration
public class AppWebMvcConfig implements WebMvcConfigurer {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
/* 去除默认的 Jackson Converter */
converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);
log.info("卸载 Jackson 解析器,添加 FastJson 解析器,用于 JSON 处理");
FastJsonHttpMessageConverter fastJsonConverter = new FastJsonHttpMessageConverter();
/* 生效的请求类型 */
List<MediaType> mediaTypeList = Arrays.asList(
MediaType.APPLICATION_JSON,
MediaType.TEXT_HTML,
MediaType.APPLICATION_XML,
MediaType.TEXT_XML,
MediaType.APPLICATION_ATOM_XML,
MediaType.APPLICATION_PROBLEM_XML,
MediaType.APPLICATION_XHTML_XML,
MediaType.APPLICATION_RSS_XML);
fastJsonConverter.setSupportedMediaTypes(mediaTypeList);
/* FastJson 配置 */
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setCharset(StandardCharsets.UTF_8);
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
fastJsonConfig.setSerializerFeatures(
SerializerFeature.PrettyFormat,
SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullListAsEmpty,
SerializerFeature.WriteDateUseDateFormat,
SerializerFeature.WriteEnumUsingToString
);
SerializeConfig serializeConfig = SerializeConfig.getGlobalInstance();
/* 大数转 String */
serializeConfig.put(BigInteger.class, ToStringSerializer.instance);
serializeConfig.put(Long.class, ToStringSerializer.instance);
serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
fastJsonConfig.setSerializeConfig(serializeConfig);
converters.add(fastJsonConverter);
}
}
验证
随便返回一个带时间戳的 JSON 响应,并设置时间戳格式为:yyyy-MM-dd HH:mm:ss.SSS
,如果时间戳按照此格式返回则配置成功。
@Data
@Builder
@AllArgsConstructor
public class Result {
private Integer code;
private String msg;
@JSONField(format = "yyyy-MM-dd HH:mm:ss.SSS")
private Date timestamp;
private Object data;
}
响应体:
{
"code": 0,
"data": {},
"msg": "success",
"timestamp": "2021-08-24 21:42:38.885"
}
设置成功,但这也显示了 FastJSON 的弊端之一,必须强制设置字段顺序,否则返回字段是无序状态。