【SpringBoot】使用第三方 JSON 解析库

1,478 阅读1分钟

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 的弊端之一,必须强制设置字段顺序,否则返回字段是无序状态。