第五章:配置使用FastJson返回Json视图

作者: 恒宇少年 | 来源:发表于2017-04-06 22:42 被阅读11082次

fastJson是阿里巴巴旗下的一个开源项目之一,顾名思义它专门用来做快速操作Json的序列化与反序列化的组件。它是目前json解析最快的开源组件没有之一!在这之前jaskJson是命名为快速操作json的工具,而当阿里巴巴的fastJson诞生后jaskjson就消声匿迹了,不过目前很多项目还在使用。

本章目标

将fastJson加入到SpringBoot项目内,配置json返回视图使用fastJson解析。

创建SpringBoot项目

看过我前几章的程序猿们都知道,我们通过IntelliJ IDEA工具创建SpringBoot项目,我们本章也不例外,具体创建步骤这里就不多做解释了,最终项目结构如下图1所示:

图1

可以看到我们事先导入了,Web、MySQL、JPA组件,我们把上一章的application.yml配置文件复制到我们的项目对应的目录下,并且修改pom.xml添加Druid的支持。如下图2所示:

图2

注意:图2中的spring-boot-stater-tomcat依赖的scope属性一定要注释掉我们才能在IntelliJ IDEA工具使用SpringBootApplication的形式运行项目!
完成上述配置后我们接下来将fastJson的maven依赖也添加进我们的pom.xml配置文件中。

添加依赖

跟我们上一章很相似,我们需要到maven仓库复制对应的maven依赖xml配置到我们项目的pom.xml中。访问仓库地址:mvnrepository.com/artifact/com.alibaba/fastjson/1.2.31,这里我们使用fastJson最新版本,我们当访问fastJson的列表界面时可以看到阿里巴巴2017年就发布了很多个版本,证明阿里巴巴一直在维护并且升级版本,所以我们可以大胆的放心使用。添加效果图如下图3所示:

图3

添加完成依赖后我们把上一章的实体类、控制器、JPA复制到我们当前项目下,我们就不重复讲解如何创建这些简单的实体类了。如下图4所示:

图4

我们接下来创建一个FastJsonConfiguration配置信息类,添加@Configuration注解让SpringBoot自动加载类内的配置,有一点要注意我们继承了WebMvcConfigurerAdapter这个类,这个类是SpringBoot内部提供专门处理用户自行添加的配置,里面不仅仅包含了修改视图的过滤还有其他很多的方法,包括我们后面章节要讲到的拦截器,过滤器,Cors配置等。
fastJson视图过滤配置详细内容如下图5所示:

图5

上述图5内fastJson配置实体调用setSerializerFeatures方法可以配置多个过滤方式,下面我们来介绍下常用的SerializerFeatures配置。

FastJson SerializerFeatures

WriteNullListAsEmpty  :List字段如果为null,输出为[],而非null
WriteNullStringAsEmpty : 字符类型字段如果为null,输出为"",而非null
DisableCircularReferenceDetect :消除对同一对象循环引用的问题,默认为false(如果不配置有可能会进入死循环)
WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非null
WriteMapNullValue:是否输出值为null的字段,默认为false。

项目初尝试运行

经过上述的配置我们基本完成对了SpringBoot整合FastJson的内容,我们接下来尝试运行下项目,如下图6所示:

图6

可以看到我们的项目正常运行了,我们访问之前编写的查询列表的请求,看是否给我返回了相应的数据,访问地址:127.0.0.1:8080/user/list,如下图7所示:

图7

可以看到我们得到了我们想要的结果,那么接下来我们该如何去测试fastJson是否已经生效了呢?

我们上述的配置中添加一个SerializerFeatures(WriteMapNullValue)这个配置的含义就是输入为NULL值的字段,我们尝试修改数据库中的nameNULL看看效果如何,如下图8所示:

图8

我们可以看到我们将之前的name为test的name字段设置了NULL,我们请求列表接口还是可以得到该字段的但是字段返回是没有值得。
接下来修改FastJsonConfiguration类内的setSerializerFeatures方法再添加一个配置WriteNullStringAsEmpty,我们再次重启项目访问用户列表地址效果如何?修改配置如下图9所示:

图9

配置修改完成后,重启我们的项目程序,访问用户列表请求地址,得到的返回结果如下图10所示:

图10

可以看到上述图10内的红色标记处,name的值从NULL变成了"",那么证明我们的fastJson消息的转换配置完美生效了。如果你的效果不是上图10所示,请检查FastJsonConfiguration配置以及maven依赖问题。

总结

以上便是我们本章的全部讲解内容,本章主要讲解了SpringBoot项目如何将返回的消息从内部的Json转换变成fastJson转换,如何添加fastJson的转换器过滤配置SerializerFeature。因为@ResultControll注解的Controller本身返回值就是json字符串,我们上述讲解通过两次修改fastJson过滤器配置的方式见证了fastJson的神奇效果。

本上内容已经上传到码云:

SpringBoot配套源码地址:https://gitee.com/hengboy/spring-boot-chapter

SpringCloud配套源码地址:https://gitee.com/hengboy/spring-cloud-chapter

SpringBoot相关系列文章请访问:目录:SpringBoot学习目录

QueryDSL相关系列文章请访问:QueryDSL通用查询框架学习目录

SpringDataJPA相关系列文章请访问:目录:SpringDataJPA学习目录

SpringBoot相关文章请访问:目录:SpringBoot学习目录,感谢阅读!

欢迎加入QQ技术交流群,共同进步。

QQ技术交流群

相关文章

网友评论

  • 头脑之外:WriteNullListAsEmpty List底层就是一个[]数组啊,返回的就是[]类型啊,null是什么意思?
  • Peter潘的博客:通过继承的方式添加貌似有点问题,会导致FastJson加到队列的最后一个,Jackson还是在队列的前面,这样HttpMessageConverter在转换的时候,会Jackson的会优先匹配,不过可能跟boot的版本有点关系,我的用2.x
  • 都市小码农:很感谢大佬的分享,受益匪浅,希望大佬继续更新,小弟鼎力支持!:smile:
    恒宇少年:@都市小码农 感谢支持,会一直更新
  • 6ec9602df16f:你好,为什么我的只有varchar型的null值可以变为"",而int和datetime不可以?
  • 7d874595741e:你好,我想请问一下我数据库写的是文字,使用fastjson后文字数据乱码了,这个怎么解决呢?
    望大神告知
    7d874595741e:@恒宇少年 在网上找到了对应的方法,感谢
    恒宇少年:@借我_3c33 数据库字符集问题
  • 0309f3250e8e:创建fastJson消息转换器 FastJsonHttpMessageConverter和FastJsonConfig引不进来飙红,看源码也没有找到,咋回事求解,谢谢
  • 5fbe15677d0f:想问您一下,为什么我 没有显示字段呢? 就是address:"bj" ,我只有"bj" ,没有显示address
  • b556a94aae38:我在使用FastJson后,配置了FastJson视图过滤,结果发现无法访问静态资源文件,比如:static/images/t.png,static/inidex.html。页面错误代码:404,控制台日志信息WARN:No mapping found for HTTP request with URI [/images/t.png] in DispatcherServlet with name 'dispatcherServlet'。请问下作者为什么会这样?
    360596e6a4bb:若controller只有@Controller,若想返回json则需要在方法上加@ResponseBody。你肯定是没有加@ResponseBody,所以controller根据你返回的值去找页面没找到。
  • c400ef5ecf71:FastJson如果返回对象为空,能否设置为{},而不是null呢?
  • 0b660fec864f:楼主的代码和楼主的演示效果是一致的,
    让我有遗憾的是没有用中文演示,否则楼主会惊奇的发现“中文乱码”。

    address: "wuhan",
    age: 10,
    id: 8,
    name: "绔�"

    我百度了“Springboot使用FastJson后,中文乱码”
    https://www.cnblogs.com/xql4j/p/6729524.html
    没有效果,也没有解决,所以就在这里留言了。
    踏着七彩祥云的盖世英雄:https://blog.csdn.net/liujun_for_java/article/details/78569608

    尝试一下将处理中文乱码那段,复制到你的代码里,但要在converters.add(fastConverter);之前
  • 59145b8e6a29:依赖druid这种情况在druid的sql监控页面可能会没有数据,依赖druid-spring-boot-starter可以解决这个问题
  • stray_dog:我像楼主这样配置后,并且继承的是废弃的WebMvcConfigurerAdapter类运行后没有效果,我将该类改成WebMvcConfigurationSupport类就能实现上述效果
    恒宇少年:@刘晓钢 使用最新的配置方式
    恒宇少年:@stray_dog 看最新章节,版本更新后有些类被废除掉了
    418843b585a8:我继承了 WebMvcConfigurationSupport 按照楼主的配置然而并没有用 求解
  • 0b660fec864f:我下载了源码,也实现了楼主的演示效果,这就完了吗?总是感觉意犹未尽。希望后续有更深入的帖子。最后,感谢楼主分享。:kissing_heart:
  • 7953294490a8:你好 boot 2.0 WebMvcConfigurerAdapter 方法过时了,有什么方法可以替换吗
  • 6be3c6d729ed:springboot自带的是jackjson吧,fastjson要快一些,但快不了多少,官网有对比的好像,另附贴为啥不推荐选fastjson。 https://www.zhihu.com/question/44199956
    也许________:两年前的帖子。
  • 4ea0af17fd67:作者,讲的太浅了,我刚配了fastjson,因为springboot默认的jackson,controller无法解析json中的字符串的时间串,我改了fastjson,然后返回中文字符串乱码,原因我追了一下,是springboot默认编码不是utf-8,而fastjson是utf-8,所以配置一下appaction.yml文件就行
    恒宇少年:@互联网编程 还有乱码的问题,你可以对应的去看下 "spring.http.encoding.charset",springboot默认的编码是不是utf-8你就清楚了,有些内容确实比较浅,这文章是我在去年比较早的时候讲解的,还请你多体谅。
  • 915f1433e136:使用fastjson为了加快解析速度吗?
  • 淡若S悠然:我的也是好奇怪,断点测试也显示注册了,但是设置SerializerFeature.WriteNullListAsEmpty失效
  • 56def38f3137:感谢,学习了。
  • 土卫十六:在这里记录一下:由于WebMvcConfigurerAdapter已废弃,配置类继承WebMvcConfigurerAdapter的方式改为实现WebMvcConfigurer接口,然后接口中的方法都是default的,不需要全部重写,此处只重写configureMessageConverters方法,具体内部代码还是这样。最后感谢作者的无私分享
    西尔维斯史泰龙:废弃的,直接继承WebMvcConfigurer。也不用调用父类。
    5fbe15677d0f:WebMvcConfigurationSupport 这个接口也行吧
  • b2efe7751b24:为什么我返回的数据是连续的,没有你那样分层结构?
    恒宇少年:@热雪1983 下载源码,查看使用方式
    b2efe7751b24:@恒宇少年 我没配置这个fastjson,值为空也不是null啊,配了跟没配效果一样....
    恒宇少年:@热雪1983 在工具内查看,或者浏览器安装json格式化插件
  • 王先生爱玩耍:我按照你的来 也是输出null哈哈哈
    王先生爱玩耍:@恒宇少年 好的好的
    恒宇少年:@王先生爱玩耍 看看文章源码吧,按照我那种方式是没有问题的
  • 647643016d13:为啥我视图效果不是你这样的格式
  • bc9b09cde488:楼主fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat, SerializerFeature.WriteClassName,//输出类名字
    SerializerFeature.WriteNullListAsEmpty,
    SerializerFeature.DisableCircularReferenceDetect
    ,SerializerFeature.WriteNullStringAsEmpty);我加了最后一个属性为什么打印出来还是null?想请教下
    恒宇少年:@陌乐儿 进群吧,文章下面都有二维码
    bc9b09cde488:@恒宇少年 你可以加下我QQ吗?我现在在弄;349536893,麻烦了
    恒宇少年:@陌乐儿 你怎么测试的?
  • 先生_bf2d:应该是@RestController注解的Controller本身返回值就是json字符串吧,楼主
    和风拂柳花香醉人:换一种实现,提高速度
    915f1433e136:@恒宇少年 好像是,楼主就是想加快速度
    恒宇少年:@先生_bf2d 你说的是对的,那个是springboot 内置默认的json方式
  • T_log:使用fastjson如果乱码了呢?
    T_log:@恒宇少年 这两个都是正确的,fastjson需要再处理一下,你的测试数据都是英文,所以乍一看是没问题的
    T_log:中文乱码需要处理一下
    //创建fastjson消息转换器
    FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
    //创建配置类
    FastJsonConfig config = new FastJsonConfig();
    //修改配置返回内容的过滤
    config.setSerializerFeatures(
    /*
    WriteNullListAsEmpty :List字段如果为null,输出为[],而非null
    WriteNullStringAsEmpty : 字符类型字段如果为null,输出为"",而非null
    DisableCircularReferenceDetect :消除对同一对象循环引用的问题,默认为false(如果不配置有可能会进入死循环)
    WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非null
    WriteMapNullValue:是否输出值为null的字段,默认为false。
    */
    SerializerFeature.DisableCircularReferenceDetect,
    SerializerFeature.WriteMapNullValue
    );
    //处理中文乱码问题
    List<MediaType> fastMediaType = new ArrayList<>();
    fastMediaType.add(MediaType.APPLICATION_JSON_UTF8);
    converter.setSupportedMediaTypes(fastMediaType);
    converter.setFastJsonConfig(config);
    //将fastjson添加到视图消息转换器列表内
    converters.add(converter);
    恒宇少年:@计冰冰 乱码应该是你项目的编码问题,或者你数据库的编码不正确。

本文标题:第五章:配置使用FastJson返回Json视图

本文链接:https://www.haomeiwen.com/subject/enfcattx.html