SpringBoot中用Fastjson替换默认的Jackson

一:前言json

  通过测试,Jackson有不少不合人意的地方,所以建议用Fastjson来替换;app

二:Jackson的坑测试

先定义实体类:ui

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class MockModel {
    private String fUid;
    private String fName;
    private String fGender;
}

坑1:这里我是用lombok的注解来自动生成构造方法和getter、setter;通过测试SpringBoot中默认的Jackson是不支持将JSON字符串序列化为@Data注解的MockModel对象的(没有手动定义getter和setter);spa

测试方式@RequestBody MockModel body;而后POST请求体参数就是对应的JSON字符串(彻底对应),可是jackson却没法转换;(自定义getter和setter方法jackson能够反序列化为MockModel对象,而Fastjson是两种均可以)code

坑2:mapping方法返回MockModel对象,jackson是能够将MockModel对象转换为JSON字符串,可是属性名却转换的很坑爹,本来我须要的是{"fUid":xxx...}可是通过jackson转换后key都变成了小写,即fuid而非fUid;orm

三:用Fastjson替换Jackson的方式对象

直接声明一个Bean便可:(注意,这个并不会覆盖掉Jackson,只不过添加了一个比默认的更优先的HttpMessageConverter)blog

  @Bean
    public HttpMessageConverters fastJsonHttpMessageConverters(){
        //1.须要定义一个convert转换消息的对象;
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        //2:添加fastJson的配置信息;
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        /**
         * TODO 第一个SerializerFeature.PrettyFormat能够省略,毕竟这会形成额外的内存消耗和流量,第二个是用来指定当属性值为null是是否输出:pro:null
      * SerializerFeature.SkipTransientField
*/ fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue); //3处理中文乱码问题 List<MediaType> fastMediaTypes = new ArrayList<>(); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); //4.在convert中添加配置信息. fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes); fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig); HttpMessageConverter<?> converter = fastJsonHttpMessageConverter; return new HttpMessageConverters(converter); }

测试有没有替换成能够经过设置SerializerFeature.PrettyFormat来看序列化的JSON字符串的格式就能够看出;接口

也能够经过下面的写法来测试(下面的方式将会令序列化为JSON字符串时变成{"f_uid":xx},本来是{"fUid":xx},可是input仍是能够两种都行)

经过这种形式能够实现和某些接口对接JSON参数格式的特殊化,即定义专门和A系统对接的AModel而后用@JSONField(name = "xx_bb"),那么和A系统传的JSON字符串就会是特殊化的(以来对应的AModel),而其余系统的则仍是默认的格式;

@JSONField(name = "f_uid")
private String fUid;  // TODO Fastjson是直接经过字段来匹配的,所以能够用@Data,没有getter和setter @JSONField也同样会生效,若是但愿某个字段不要序列化为JSON字符串能够加transient;

Fastjson没有jackson中的坑1和坑2,且支持将如{"aa_bb":33}转换为属性名aaBb为其赋值33(且还支持部分属性是aa_bb部分倒是uuMm的形式的转换)

三:JSON格式的一些注意事项

1.key-value的分隔符只能是:号而不能是=号

2.数值字符串能够转换为数值属性,数值也能够转换为字符串属性(如fUid:33能够转换为MockModel中String的fUid),至少Fastjson支持;

3.key部分最好都用""包裹,通过测试有一些JSON包是不支持如{fUid:33}的,只支持{"fUid":33}

4.主流的JSON包都支持如{"fName":null}的写法;

四:其余

SpringBoot里GET方法能够不设置Content-Type(由于都不会用到);可是POST必须设置这个属性,并且貌似还不能是*/*;xx的类型??,好比上面的json参数就要Content-Type:application/json;charset=utf8(charset能够不要,可是最好写上)

相关文章
相关标签/搜索