一:前言

  经过测试,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":xxx...}但是经过jackson转换后key都变成了小写,即fuid而非fUid;

三:用Fastjson替换Jackson的方式

直接声明一个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可以不要,但是最好写上)

最新文章

  1. js call apply
  2. dede织梦后台如何修改?如何增加删除菜单?(
  3. Android ViewPager更新数据
  4. PHP实现站点pv,uv统计(三)
  5. poj2393
  6. Android使用HttpURLConnection下载图片
  7. ASP对数据库的操作方法
  8. (转载)SVM-基础(三)
  9. SqlServer 跨网段跨服务器复制
  10. jframe 对象(GroupedAction)传递无法调用对象的方法解决办法
  11. ACM计划
  12. PHP图片裁剪与缩放示例(无损裁剪图片)
  13. Web移动端布局
  14. Get buck-boost performance from a boost regulator
  15. nodejs做中间层,向后端取数据
  16. 利用PXE引导安装centos7
  17. ServiceStack.Redis.RedisNativeClient的方法“get_Db”没有实现。
  18. How To Install Nginx on Ubuntu 16.04 zz
  19. Keras网络层之“关于Keras的层(Layer)”
  20. 【SQL SERVER学习笔记】Sqlserver游标的尝试

热门文章

  1. OC 开发规范指南 - 个人见解写的很好
  2. cmd乱码问题
  3. YII2表单中上传单个文件
  4. Python 列表推导实例
  5. 8K - 圆桌会议
  6. (转)在WinForm中选择本地文件
  7. andorid 菜单 进度条
  8. generic_netlink 用法
  9. UI设计教程分享:字体变形—阴阳收缩法
  10. How To Configure SAMBA Server And Transfer Files Between Linux &amp; Windows