使用阿里巴巴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 传给前端或者其他接口,还带上了状态码和提示信息,这在实际项目场景中应用非常广泛。
相关文章
|
12天前
|
数据采集 人工智能 安全
|
8天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
597 4
|
8天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
345 164
|
7天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
349 155

热门文章

最新文章