SpringBoot中⽤Fastjson替换默认的Jackson
⼀:前⾔
  经过测试,Jackson有很多不合⼈意的地⽅,因此建议⽤Fastjson来替换;
⼆:Jackson的坑
先定义实体类:
@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);
测试⽅式@RequestBody MockModel body;然后POST请求体参数就是对应的JSON字符串(完全对应),但是jackson却⽆法转换;(⾃定义getter和setter⽅法jackson可以反序列化为MockModel对象,⽽Fastjson是两种都可以)
坑2:mapping⽅法返回MockModel对象,jackson是可以将MockModel对象转换为JSON字符串,但是属性名却转换的很坑爹,原本我需要的是{"fUid":}但是经过jackson转换后key都变成了⼩写,即fuid⽽⾮fUid;
三:⽤Fastjson替换Jackson的⽅式
fastjson怎么用直接声明⼀个Bean即可:(注意,这个并不会覆盖掉Jackson,只不过添加了⼀个⽐默认的更优先的HttpMessageConverter)
  @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可以不要,但是最好写上)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。