一:前言
经过测试,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可以不要,但是最好写上)
SpringBoot中用Fastjson替换默认的Jackson的更多相关文章
-
dubbox REST服务使用fastjson替换jackson
上一节讲解了resteasy如何使用fastjson来替换默认的jackson,虽然dubbox内部采用的就是resteasy,但是大多数情况下,dubbox服务是一个独立的app,并不需要以war包 ...
-
jersey 用FastJson替换掉默认的Jackson
@Bean public ResourceConfig resourceConfig() { ResourceConfig resourceConfig = new ResourceConfig(); ...
-
SpringBoot(十六):SpringBoot2.1.1集成fastjson,并使用fastjson替代默认的MappingJackson
springboot2.1.1默认采用的json converter是MappingJackson,通过调试springboot项目中代码可以确定这点.在springboot项目中定义WebMvcCo ...
-
十七、springboot配置FastJson为Spring Boot默认JSON解析框架
前提 springboot默认自带json解析框架,默认使用jackson,如果使用fastjson,可以按照下列方式配置使用 1.引入fastjson依赖库: maven: <dependen ...
-
springboot打包去除资源文件,启动时指定配置文件位置,使用log4j2替换默认logback
springboot打包时,去掉资源文件 <build> <resources> <resource> <directory>src/main/reso ...
-
springboot使用fastjson中文乱码解决方法 【转载】
以前使用fastjson替换jackson时,没有直接在页面打印过json,都是js使用没有出现乱码,偶然 打印出来出现了中文乱码 之前使用的配置方式 @Configuration public cl ...
-
Springboot使用FastJson后,接口返回中文乱码的问题解决。
哎,天下文章一大抄,到处都是一模一样的教你怎么替换掉jackson成fastjson的,可后续中文乱码网上居然没一篇文章.翻了一会源码还是写个文章共享下吧.免得后来人又浪费时间折腾. 在springb ...
-
springboot使用fastJson作为json解析框架
springboot使用fastJson作为json解析框架 springboot默认自带json解析框架,默认使用jackson,如果使用fastjson,可以按照下列方式配置使用 〇.搭建spri ...
-
freeswitch 使用mysql替换默认的sqlite
转自 80000hz.com freeswitch 使用mysql替换默认的sqlite No Reply , Posted in 默认分类 on January 14, 2014 目标使用mysql ...
随机推荐
-
Python学习笔记(二)——HelloWorld
一.交互式化环境下书写代码 二.使用文本编辑器编辑.py文件 1.建议,使用Nodepad++,好看,免费,度娘直接搜素即可. 2.编写代码 3.保存为.py结尾的文件 4.使用cmd,打开到文件所在 ...
-
Android Studio使用教程-菜单(Edit)
3.2.1.Undo(Ctrl+Z) 撤销上一次操作 3.2.2.Redo(Ctrl+Shift+Z) 退出撤销操作 3.2.3.Cut(Ctrl+X) 剪切 3.2.4.Copy(Ctrl+C) 复 ...
-
在as3中使用protobuf
在最近参与开发的adobe air项目中,前后端的通信协议从XML.JSON再到protobuf,最后选择protobuf原因,主要是前后端维护protobuf协议就行了,同时还可以利用IDE做一些编 ...
-
AMQ学习笔记 - 16. 确认机制的测试
概述 对Acknowledge机制进行测试. 此处的测试是针对Consumer的确认设计的:对于Producer的确认是透明的,无法提供测试. 测试实例 设计demo,测试三种确认机制. 测试机制 测 ...
-
MVC WEB api 自动生成文档
最近在一直在用webapi做接口给移动端用.但是让我纠结的时候每次新加接口或者改动接口的时候,就需要重新修改文档这让我很是苦恼.无意中发现.webapi居然有自动生成文档的功能....真是看见了救星啊 ...
-
SLF4J 教程
转自:SLF4J 教程 一.介绍:简单日记门面(simple logging Facade for java)SLF4J是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署 ...
-
Cron 时间元素
一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素. 按顺序依次为 秒(0~59) 分钟(0~59) 小时(0~23) 天(月)(0~31,但是你需要考虑你月的天数) 月(0~11) 天( ...
-
Java类加载机制、类加载器和反射机制-思维导图
参考文献: 1. <深入理解JVM虚拟机>
-
前端开发之基础知识-HTML(二)
1.6 html链接 html链接 <a>标签可以在网页上定义一个链接地址,通过src属性定义跳转的地址,通过title属性定义鼠标悬停时弹出的提示文字框. <a href=&quo ...
-
Shell中字符串的切割、拼接、比较、替换
[截取] 一.Linux shell 截取字符变量的前8位,有方法如下: expr substr “$a” 1 8 : 二.按指定的字符串截取 第一种方法: ${varible##*string} # ...