使用阿里巴巴FastJson的设置

简介: 本文对比了 fastJson 与 jackson 在使用难度、功能支持及性能上的差异,介绍了 fastJson 的依赖引入与 null 值处理配置,并通过封装统一的 JSON 返回结构 `JsonResult`,实现包含数据、状态码和提示信息的标准化响应,提升前后端交互的规范性与可维护性。

2.1 jackson 和 fastJson 的对比
有很多朋友习惯于使用阿里巴巴的 fastJson 来做项目中 json 转换的相关工作,目前我们项目中使用的就是阿里的 fastJson,那么 jackson 和 fastJson 有哪些区别呢?根据网上公开的资料比较得到下表。
选项 fastJson jackson
上手难易程度 容易 中等
高级特性支持 中等 丰富
官方文档、Example支持 中文 英文
处理json速度 略快 快
关于 fastJson 和 jackson 的对比,网上有很多资料可以查看,主要是根据自己实际项目情况来选择合适的框架。从扩展上来看,fastJson 没有 jackson 灵活,从速度或者上手难度来看,fastJson 可以考虑,我们项目中目前使用的是阿里的 fastJson,挺方便的。
2.2 fastJson依赖导入
使用 fastJson 需要导入依赖,本课程使用 1.2.35 版本,依赖如下:


com.alibaba
fastjson
1.2.35

2.2 使用 fastJson 处理 null
使用 fastJson 时,对 null 的处理和 jackson 有些不同,需要继承 WebMvcConfigurationSupport 类,然后覆盖 configureMessageConverters 方法,在方法中,我们可以选择对要实现 null 转换的场景,配置好即可。如下:
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class fastJsonConfig extends WebMvcConfigurationSupport {
/**

 * 使用阿里 FastJson 作为JSON MessageConverter
 * @param converters
 */
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
    FastJsonConfig config = new FastJsonConfig();
    config.setSerializerFeatures(
            // 保留map空的字段
            SerializerFeature.WriteMapNullValue,
            // 将String类型的null转成""
            SerializerFeature.WriteNullStringAsEmpty,
            // 将Number类型的null转成0
            SerializerFeature.WriteNullNumberAsZero,
            // 将List类型的null转成[]
            SerializerFeature.WriteNullListAsEmpty,
            // 将Boolean类型的null转成false
            SerializerFeature.WriteNullBooleanAsFalse,
            // 避免循环引用
            SerializerFeature.DisableCircularReferenceDetect);
    converter.setFastJsonConfig(config);
    converter.setDefaultCharset(Charset.forName("UTF-8"));
    List<MediaType> mediaTypeList = new ArrayList<>();
    // 解决中文乱码问题,相当于在Controller上的@RequestMapping中加了个属性produces = "application/json"
    mediaTypeList.add(MediaType.APPLICATION_JSON);
    converter.setSupportedMediaTypes(mediaTypeList);
    converters.add(converter);
}

}

  1. 封装统一返回的数据结构
    以上是 Spring Boot 返回 json 的几个代表的例子,但是在实际项目中,除了要封装数据之外,我们往往需要在返回的 json 中添加一些其他信息,比如返回一些状态码 code ,返回一些 msg 给调用者,这样调用者可以根据 code 或者 msg 做一些逻辑判断。所以在实际项目中,我们需要封装一个统一的 json 返回结构存储返回信息。
    3.1 定义统一的 json 结构
    由于封装的 json 数据的类型不确定,所以在定义统一的 json 结构时,我们需要用到泛型。统一的 json 结构中属性包括数据、状态码、提示信息即可,构造方法可以根据实际业务需求做相应的添加即可,一般来说,应该有默认的返回结构,也应该有用户指定的返回结构。如下:
    public class JsonResult {
    private T data;
    private String code;
    private String msg;
    /**
    • 若没有数据返回,默认状态码为0,提示信息为:操作成功!
      /
      public JsonResult() {
      this.code = "0";
      this.msg = "操作成功!";
      }
      /*
    • 若没有数据返回,可以人为指定状态码和提示信息
    • @param code
    • @param msg
      /
      public JsonResult(String code, String msg) {
      this.code = code;
      this.msg = msg;
      }
      /*
    • 有数据返回时,状态码为0,默认提示信息为:操作成功!
    • @param data
      /
      public JsonResult(T data) {
      this.data = data;
      this.code = "0";
      this.msg = "操作成功!";
      }
      /*
    • 有数据返回,状态码为0,人为指定提示信息
    • @param data
    • @param msg
      */
      public JsonResult(T data, String msg) {
      this.data = data;
      this.code = "0";
      this.msg = msg;
      }
      // 省略get和set方法
      }
      3.2 修改 Controller 中的返回值类型及测试
      由于 JsonResult 使用了泛型,所以所有的返回值类型都可以使用该统一结构,在具体的场景将泛型替换成具体的数据类型即可,非常方便,也便于维护。在实际项目中,还可以继续封装,比如状态码和提示信息可以定义一个枚举类型,以后我们只需要维护这个枚举类型中的数据即可(在本课程中就不展开了)。根据以上的 JsonResult,我们改写一下 Controller,如下:
      @RestController
      @RequestMapping("/jsonresult")
      public class JsonResultController {
      @RequestMapping("/user")
      public JsonResult getUser() {
      User user = new User(1, "倪升武", "123456");
      return new JsonResult<>(user);
      }
      @RequestMapping("/list")
      public JsonResult getUserList() {
      List userList = new ArrayList<>();
      User user1 = new User(1, "倪升武", "123456");
      User user2 = new User(2, "达人课", "123456");
      userList.add(user1);
      userList.add(user2);
      return new JsonResult<>(userList, "获取用户列表成功");
      }
      @RequestMapping("/map")
      public JsonResult getMap() {
      Map map = new HashMap<>(3);
      User user = new User(1, "倪升武", null);
      map.put("作者信息", user);
      map.put("博客地址", "http://blog.itcodai.com");
      map.put("CSDN地址", null);
      map.put("粉丝数量", 4153);
      return new JsonResult<>(map);
      }
      }
      我们重新在浏览器中输入:localhost:8080/jsonresult/user 返回 json 如下:
      {"code":"0","data":{"id":1,"password":"123456","username":"倪升武"},"msg":"操作成功!"}
      输入:localhost:8080/jsonresult/list,返回 json 如下:
      {"code":"0","data":[{"id":1,"password":"123456","username":"倪升武"},{"id":2,"password":"123456","username":"达人课"}],"msg":"获取用户列表成功"}
      输入:localhost:8080/jsonresult/map,返回 json 如下:
      {"code":"0","data":{"作者信息":{"id":1,"password":"","username":"倪升武"},"CSDN地址":null,"粉丝数量":4153,"博客地址":"http://blog.itcodai.com"},"msg":"操作成功!"}
      通过封装,我们不但将数据通过 json 传给前端或者其他接口,还带上了状态码和提示信息,这在实际项目场景中应用非常广泛。
相关文章
|
8月前
|
JSON 安全 fastjson
使用阿里巴巴 Fastjson 替代 Spring Boot 默认的 Jackson
本文介绍在 Spring Boot 项目中如何替换默认的 Jackson,集成阿里巴巴 Fastjson 作为 JSON 处理框架。内容涵盖 Fastjson 与 Jackson 的核心对比、依赖配置、自定义消息转换器、null 值统一处理及循环引用控制,并提供安全建议与最佳实践,助你高效、安全地使用 Fastjson。
|
11月前
|
JSON fastjson Java
FastJson 完全学习指南(初学者从零入门)
摘要:本文是FastJson的入门学习指南,主要内容包括: JSON基础:介绍JSON格式特点、键值对规则、数组和对象格式,以及嵌套结构的访问方式。FastJson是阿里巴巴开源的高性能JSON解析库,具有速度快、功能全、使用简单等优势,并介绍如何引入依赖,如何替换Springboot默认的JackJson。 核心API: 序列化:将Java对象转换为JSON字符串,演示对象、List和Map的序列化方法; 反序列化:将JSON字符串转回Java对象,展示基本对象转换方法;
3732 77
|
Unix API 开发者
Flutter笔记:使用Flutter私有类涉及的授权协议问题
Flutter笔记:使用Flutter私有类涉及的授权协议问题
611 1
|
存储 缓存 负载均衡
图解一致性哈希算法,看这一篇就够了!
近段时间一直在总结分布式系统架构常见的算法。前面我们介绍过布隆过滤器算法。接下来介绍一个非常重要、也非常实用的算法:一致性哈希算法。通过介绍一致性哈希算法的原理并给出了一种实现和实际运用的案例,带大家真正理解一致性哈希算法。
30950 66
图解一致性哈希算法,看这一篇就够了!
|
内存技术
top命令里内存参数 VIRT, RES 和 SHR 分别是什么意思
top指令输出的VIRT, RES 和SHR有什么区别
4100 0