Spring Boot 整合 JSON - Jackson/Gson/FastJson

2023-11-10

学习 Spring Boot 整合 JSON - Jackson/Gson/FastJson 。

1 Spring MVC 整合 JSON

先来回顾下在 Spring MVC 中如何整合 JSON 。 Spring MVC 可以接收 JSON 参数,也可以返回 JSON 参数,这一切依赖于 HttpMessageConverter 。它可以将一个 JSON 字符串转为对象,也可以将一个对象转为 JSON 字符串,实际上它的底层还是依赖于具体的 JSON 库。因此所有的 JSON 库要在 Spring MVC 中自动返回或者接收 JSON ,都必须提供和自己相关的 HttpMessageConverter 。

Spring MVC 中,默认提供了 Jackson 和 Gson 的 HttpMessageConverter ,分别是: MappingJackson2HttpMessageConverterGsonHttpMessageConverter 。正因为如此,我们在 Spring MVC 中,如果要使用 JSON ,对于 Jackson 和 Gson 我们只需要添加依赖,加完依赖就可以直接使用了。具体的配置是在 AllEncompassingFormHttpMessageConverter 类中完成的。

但是如果我们使用 FastJson ,默认情况下,Spring MVC 并没有提供 FastJson 的 HttpMessageConverter ,因此需要我们自己提供,如果是在 XML 配置中, FastJson 除了添加依赖,还要显式配置 HttpMessageConverter ,如下:

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

2 Spring Boot 整合 JSON

Spring Boot 中关于 JSON 的默认解析方案是 Jackson ,会自动导入相关依赖。如果想要使用 Gson 或 FastJson ,则需要我们手动添加相关依赖,并排除掉默认的 JSON 依赖。

2.1 Jackson

创建 Spring Boot 项目 spring-boot-jackson ,增加 Web 依赖。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

在 src/main/java 下相应的包中新建 User 类,如下:

public class User {
    private Integer id;
    private String username;
    private String address;
    private Date birthday;

    // getter/setter
}

在 src/main/java 下相应的包中新建 UserController 类,如下:

@RestController
public class UserController {
    @GetMapping("/user")
    public List<User> getAllUser() {
        List<User> users = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            User user = new User();
            user.setUsername("cxy35 >> " + i);
            user.setAddress("https://cxy35.com >> " + i);
            user.setId(i);
            user.setBirthday(new Date());
            users.add(user);
        }
        return users;
    }
}

启动项目,访问 http://120.0.0.1:8080/user 来验证,此时就可以正常返回 json 了,但发现 birthday 的日期格式展示不是很友好,可以通过覆盖 Jackson 的默认 Bean ,并增加日期格式化相关代码来解决(这里只增加处理日期格式化的功能,如果有其他需求,增加相应的代码即可),有 2 种方法覆盖。

在 src/main/java 下相应的包中新建 WebMvcConfig 配置类,如下:

@Configuration
public class WebMvcConfig {

    // 实现日期格式化方法1:
    // 覆盖 JacksonHttpMessageConvertersConfiguration 中默认的 MappingJackson2HttpMessageConverter
    /*@Bean
    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        ObjectMapper om = new ObjectMapper();
        om.setDateFormat(new SimpleDateFormat("yyyy/MM/dd"));
        converter.setObjectMapper(om);
        return converter;
    }*/

    // 实现日期格式化方法2(更小的粒度):
    // 覆盖 JacksonHttpMessageConvertersConfiguration 中默认的 ObjectMapper(由 JacksonAutoConfiguration 中注入)
    @Bean
    ObjectMapper objectMapper() {
        ObjectMapper om = new ObjectMapper();
        om.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
        return om;
    }
}

另外还有 1 种方式可以实现日期格式化,通过在对应 pojo 的属性上加注解,如下:

public class User {
    private Integer id;
    private String username;
    private String address;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthday;

    // getter/setter
}

启动项目,访问 http://120.0.0.1:8080/user 来验证。

2.2 Gson

创建 Spring Boot 项目 spring-boot-gson ,增加 Web 和 Gson 依赖,并排除掉默认的 JSON 依赖。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-json</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

在 src/main/java 下相应的包中新建 User 类,如下:

public class User {
    private Integer id;
    private String username;
    private String address;
    private Date birthday;

    // getter/setter
}

在 src/main/java 下相应的包中新建 UserController 类,如下:

@RestController
public class UserController {
    @GetMapping("/user")
    public List<User> getAllUser() {
        List<User> users = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            User user = new User();
            user.setUsername("cxy35 >> " + i);
            user.setAddress("https://cxy35.com >> " + i);
            user.setId(i);
            user.setBirthday(new Date());
            users.add(user);
        }
        return users;
    }
}

启动项目,访问 http://120.0.0.1:8080/user 来验证,此时就可以正常返回 json 了,但发现 birthday 的日期格式展示不是很友好,可以通过覆盖 Gson 的默认 Bean ,并增加日期格式化相关代码来解决(这里只增加处理日期格式化的功能,如果有其他需求,增加相应的代码即可),有 2 种方法覆盖。

在 src/main/java 下相应的包中新建 WebMvcConfig 配置类,如下:

@Configuration
public class WebMvcConfig {

    // 实现日期格式化方法1:
    // 覆盖 GsonHttpMessageConvertersConfiguration 中默认的 GsonHttpMessageConverter
    /*@Bean
    GsonHttpMessageConverter gsonHttpMessageConverter() {
        GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
        converter.setGson(new GsonBuilder().setDateFormat("yyyy/MM/dd").create());
        return converter;
    }*/

    // 实现日期格式化方法2(更小的粒度):
    // 覆盖 GsonHttpMessageConvertersConfiguration 中默认的 Gson(由 GsonAutoConfiguration 中注入)
    @Bean
    Gson gson() {
        return new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
    }
}

另外还有 1 种方式可以实现日期格式化,通过在对应 pojo 的属性上加注解,如下:

public class User {
    private Integer id;
    private String username;
    private String address;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthday;

    // getter/setter
}

启动项目,访问 http://120.0.0.1:8080/user 来验证。

2.3 FastJson

创建 Spring Boot 项目 spring-boot-fastjson ,增加 Web 和 FastJson 依赖,并排除掉默认的 JSON 依赖。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-json</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.60</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

在 src/main/java 下相应的包中新建 User 类,如下:

public class User {
    private Integer id;
    private String username;
    private String address;
    private Date birthday;

    // getter/setter
}

在 src/main/java 下相应的包中新建 UserController 类,如下:

@RestController
public class UserController {
    @GetMapping("/user")
    public List<User> getAllUser() {
        List<User> users = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            User user = new User();
            user.setUsername("cxy35 >> " + i);
            user.setAddress("https://cxy35.com >> " + i);
            user.setId(i);
            user.setBirthday(new Date());
            users.add(user);
        }
        return users;
    }
}

启动项目,访问 http://120.0.0.1:8080/user 来验证,此时就可以正常返回 json 了,但发现 birthday 的日期格式展示不是很友好,可以通过覆盖 FastJson 的默认 Bean ,并增加日期格式化相关代码来解决(这里只增加处理日期格式化的功能,如果有其他需求,增加相应的代码即可)。

在 src/main/java 下相应的包中新建 WebMvcConfig 配置类,如下:

@Configuration
public class WebMvcConfig {

    // 实现日期格式化:
    // 提供自定义的 FastJsonHttpMessageConverter
    @Bean
    FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setDateFormat("yyyy-MM-dd");
        converter.setFastJsonConfig(config);
        return converter;
    }
}

另外还有 1 种方式可以实现日期格式化,通过在对应 pojo 的属性上加注解,如下:

public class User {
    private Integer id;
    private String username;
    private String address;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthday;

    // getter/setter
}

启动项目,访问 http://120.0.0.1:8080/user 来验证。



扫码关注微信公众号 程序员35 ,获取最新技术干货,畅聊 #程序员的35,35的程序员# 。独立站点:https://cxy35.com

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 整合 JSON - Jackson/Gson/FastJson 的相关文章

随机推荐

  • minikube:部署一个nginx应用

    通过run命令运行pod 创建pod minikube kubectl run nginx image nginx port 80 查看pod的ip minikube kubectl get pods o wide 遇到查看不到IP的问题可
  • 关于自定义视图容器(Container View Controller)

    苹果对UIViewController以及其使用有着非常详细的文档 UIViewController Reference ViewController Programming Guide 一 UIViewController 作为iOS开发
  • 惠普笔记本重装win10系统教程

    惠普PAVILION 15 AU034TX X0S89PA 重装系统教程 文章目录 惠普PAVILION 15 AU034TX X0S89PA 重装系统教程 1 Bios设置启动盘 2 开始重装系统操作 3 电脑基本设置 4 激活win10
  • python源程序执行的方式是边编译边执行吗_Python代码是编译执行还是解释执行?...

    有人在讨论 Python 代码是编译执行还是解释执行 这个问题还可以换一种说法 Python 是编译型语言还是解释型语言 回答这个问题前 我们先弄清楚什么是编译型语言 什么是解释型语言 所谓编译执行就是源代码经过编译器编译处理 生成目标机器
  • MySQL存储过程专题

    文章目录 MySQL存储过程 0 环境说明 1 使用说明 2 准备 3 语法 3 0 语法结构 3 1 变量及赋值 1 局部变量 2 用户变量 3 会话变量 4 全局变量 3 2 入参出参 3 3 流程控制 判断 if case 3 4 流
  • Python反编译exe

    TOC Python反编译exe 下载工具 1 python国内下载 https mirrors huaweicloud com python 建议使用 3 10一下的版本 2 下载 下载pyinstxtractor 网址 https gi
  • Python-pandas-画柱状图/饼图

    一 柱状图 import pandas as pd pandas的制图功能是构建在matplotlib之上的 import matplotlib pyplot as plt 1 使用pandas画图 datas pd read excel
  • git rm -r cached <dir>按层次遍历目录导致删除目录下文件时“未匹配任何文件“错误

    haypin MBP cpp cmake js java python main git add haypin MBP cpp cmake js java python main find ipath js o ipath build o
  • Qt窗口大小设置

    用Qt创建一个窗口 如何调整窗口的大小呢 1 setBaseSize 调用这个方法 1 setBaseSize 800 600 运行程序 发现一点效果都没有 注意我这里并没有使用setFixedSize setMaximumSize 因为虽
  • LightGBM原理简介

    1 LightGBM简介 Light Gradient Boosting Machine 是一个实现GBDT算法的框架 支持高效率的并行训练 并且具有以下优点 1 更快的训练速度 2 更低的内存消耗 3 更好的准确率 4 分布式支持 可以快
  • 智能指针详细解析(智能指针的使用,原理解析)

    本文转自努力的少年博主 https blog csdn net sjp11 article details 123899141 目录 一 智能指针的基本概念 二 智能指针的定义和使用 三 auto ptr 四 unique ptr 五 sh
  • 在群晖上安装Nextcloud-AIO详解

    本文是应网友 刘源 的要求折腾的 什么是 Nextcloud AIO Nextcloud AIO 就是 Nextcloud All in One 顾名思义就是一个 Nextcloud 的 All in One 版本 这是一个基于 Docke
  • 图解浏览器缓存,教你提高用户体验

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由前端林子发表于云 社区专栏 浏览器缓存 是浏览器端保存数据 用于快速读取或避免重复资源请求的优化机制 有效的缓存使用可以避免重复的网络请求和加快页面速度 从而提高用户体验 一
  • 2021上海交大网络安全保研夏令营经验

    个人情况 某985高校信息安全专业 排名前6 六级539 校级一等奖学金多次 竞赛 数模美赛m奖 数模国赛省二等 科研 无成果发表 只有一些实验室 校级项目经历 一 选拔流程 各学科组织专家组对申请者进行全面考查 形式为线下复试包括笔试和面
  • ORACLE-电信行业解决方案研讨会笔记

    ORACLE近况 08财年收入224亿美元10W员工中国2100 员工 中间件 理念COMPLETE OPEN INTEGRATED产品策略 开发工具 JDeveloper为oracle 的将来开发工具 BEA workshop向Jdeve
  • Requests爬虫方法

    目录 一 Requests 简介 1 1 requests是什么 1 2 安装 1 3 response的属性及类型 二 requests使用 2 1 requests 的 get 请求 2 2 requests 的 post 请求 2 3
  • LRU 最近最少使用算法

    LRU 最近最少使用算法 设计LRU Cash 数据结构 设计方法 代码实现 总结 百度百科 LRU是Least Recently Used的缩写 即最近最少使用 是一种常用的页面置换算法 选择最近最久未使用的页面予以淘汰 该算法赋予每个页
  • 项目打War 并部署到Tomcat上去(注重步骤)

    一 打包 点开我们idea 中对应的maven 在对应模块中找到有 root 的那个模块 进行package 打包 打包完成后 去对应的路径下找到刚打的新鲜war包 进入bin 目录后 双击startup bat 运行即可
  • java几种删除_几种删除Linux目录的方法

    在Linux中有很多方法可以删除目录 在图形化界面可以利用文件管理器 或者通过终端删除 本文将介绍在文本界面使用命令删除目录 使用rmdir删除目录 Rmdir命令间成 remove directory 用于删除空目录的命令 例如 删除一个
  • Spring Boot 整合 JSON - Jackson/Gson/FastJson

    学习 Spring Boot 整合 JSON Jackson Gson FastJson 1 Spring MVC 整合 JSON 先来回顾下在 Spring MVC 中如何整合 JSON Spring MVC 可以接收 JSON 参数 也