当前位置: 首页 > article >正文

Spring Boot项目中JSON解析库的深度解析与应用实践

在现代Web开发中,JSON(JavaScript Object Notation)作为轻量级的数据交换格式,已成为前后端通信的核心桥梁。Spring Boot作为Java生态中最流行的微服务框架,提供了对多种JSON库的无缝集成支持。本文将深入探讨Spring Boot项目中主流JSON解析库的使用方法、性能对比及最佳实践。


在这里插入图片描述

一、为何需要JSON解析库?

在Spring Boot应用中,JSON解析库承担着关键角色:

  1. HTTP通信:处理Controller的@RequestBody和@ResponseBody
  2. 数据持久化:数据库JSON字段与Java对象的转换
  3. 微服务交互:服务间RESTful API的数据序列化
  4. 配置文件:解析application.json等配置文件

二、Spring Boot支持的三大JSON库

1. Jackson(默认集成)

作为Spring Boot的默认JSON处理器,Jackson以其高性能和丰富功能著称。

核心依赖(Spring Boot Starter Web已包含):

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.0</version>
</dependency>

基础用法示例

// 序列化Java对象→JSON
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user); // 反序列化JSON→Java对象
User user = mapper.readValue(json, User.class);

高级特性

// 处理日期格式
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));// 忽略未知属性
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);// 美化输出
String prettyJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);

2. Gson(Google出品)

Google开发的轻量级库,API设计简洁,适合简单场景。

添加依赖

<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.10.1</version>
</dependency>

配置Spring Boot使用Gson

@Bean
public HttpMessageConverters gsonConverter() {Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();return new HttpMessageConverters(new GsonHttpMessageConverter(gson));
}

序列化/反序列化示例

Gson gson = new Gson();// 对象→JSON
String json = gson.toJson(user);// JSON→对象
User user = gson.fromJson(json, User.class);// 处理泛型集合
Type listType = new TypeToken<List<User>>(){}.getType();
List<User> users = gson.fromJson(jsonArray, listType);

3. Fastjson(阿里巴巴高性能库)

国内流行的JSON库,号称最快的JSON解析器。

添加依赖

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.34</version>
</dependency>

配置为Spring默认解析器

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();converter.setFastJsonConfig(fastJsonConfig());converters.add(0, converter);}private FastJsonConfig fastJsonConfig() {FastJsonConfig config = new FastJsonConfig();config.setSerializerFeatures(SerializerFeature.PrettyFormat,SerializerFeature.WriteMapNullValue);config.setDateFormat("yyyy-MM-dd HH:mm:ss");return config;}
}

核心API示例

// 序列化
String json = JSON.toJSONString(user, SerializerFeature.WriteDateUseDateFormat);// 反序列化
User user = JSON.parseObject(json, User.class);// 解析JSON数组
List<User> users = JSON.parseArray(jsonArray, User.class);

三、三大JSON库性能对比(基准测试参考)

特性JacksonGsonFastjson
序列化速度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
反序列化速度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
内存占用中等较高较低
功能完整性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
社区支持强大(官方)强大(Google)活跃(阿里)
安全漏洞修复速度极快历史问题较多

注:测试基于JDK 17/Spring Boot 3.1,数据样本为10KB的嵌套JSON对象


四、高级应用场景

1. 自定义序列化规则(Jackson示例)

public class MoneySerializer extends JsonSerializer<BigDecimal> {@Overridepublic void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider provider) {gen.writeString(value.setScale(2, RoundingMode.HALF_UP) + "元");}
}// 在实体类中使用
public class Order {@JsonSerialize(using = MoneySerializer.class)private BigDecimal amount;
}

2. 处理多态类型(Jackson)

@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")
@JsonSubTypes({@Type(value = Dog.class, name = "dog"),@Type(value = Cat.class, name = "cat")
})
public abstract class Animal {}// 序列化时将自动添加"type":"dog"字段

3. 超大JSON流式处理(Jackson)

try(JsonParser parser = mapper.createParser(new File("large.json"))) {while (parser.nextToken() != null) {JsonToken token = parser.currentToken();if (token == JsonToken.FIELD_NAME && "name".equals(parser.getText())) {parser.nextToken();System.out.println(parser.getText());}}
}

五、最佳实践建议

  1. 默认选择Jackson

    • 无需额外配置
    • 与Spring生态深度集成
    • 良好的长期维护性
  2. 关键性能场景考虑Fastjson

    • 高并发接口
    • 大数据量处理
    • 注意:需及时更新版本修复安全漏洞
  3. 全局配置统一日期格式

    # application.yml
    spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8
    
  4. 启用压缩减少网络传输

    // 使用Jackson的压缩特性
    mapper.configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true);
    
  5. 防御性编程建议

    // 反序列化时设置最大长度
    factory.setStreamReadConstraints(StreamReadConstraints.builder().maxStringLength(10_000_000).build());
    

六、常见问题解决方案

问题1:日期格式不一致

@JsonFormat(pattern = "yyyy/MM/dd", timezone = "Asia/Shanghai")
private Date birthDate;

问题2:忽略空字段

@JsonInclude(Include.NON_NULL)  // Jackson
@Expose(serialize = false)      // Gson
private String optionalField;

问题3:字段名映射

@JsonProperty("user_name")      // Jackson
@SerializedName("user_name")    // Gson
private String username;

结语

在Spring Boot项目中,合理选择并高效使用JSON解析库,直接关系到系统的性能、稳定性和开发效率。本文详细剖析了三大主流库的核心用法与适用场景:

  1. Jackson - 推荐作为默认选择,功能全面、性能优异
  2. Gson - 适合简单场景和Android兼容需求
  3. Fastjson - 性能极致但需关注安全更新

无论选择哪种方案,建议遵循以下原则:

  • 生产环境统一序列化配置
  • 严格校验外部输入JSON
  • 针对大文件采用流式处理
  • 定期更新库版本

通过掌握这些核心技巧,开发者能够构建出高效、健壮的JSON处理体系,为微服务架构下的数据交互奠定坚实基础。

相关文章:

Spring Boot项目中JSON解析库的深度解析与应用实践

在现代Web开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为轻量级的数据交换格式&#xff0c;已成为前后端通信的核心桥梁。Spring Boot作为Java生态中最流行的微服务框架&#xff0c;提供了对多种JSON库的无缝集成支持。本文将深入探讨Spring B…...

我用Amazon Q写了一个Docker客户端,并上架了懒猫微服商店

自从接触了Amazon Q&#xff0c;我陆陆续续写了不少小软件&#xff0c;其中这个项目是一个典型的例子&#xff0c;自己平时来使用&#xff0c;也分享给一些 NAS 爱好者来用。 故事还要用上次折腾黑群晖说起&#xff0c;本意想把 NAS 和打印机共享二合一的&#xff0c;所以把闲着…...

Django CMS 的 Demo

以下是关于 Django CMS 的 Demo 示例及相关资源的整理 安装与运行 Django CMS 示例 使用 djangocms-installer 快速创建 Django CMS 项目&#xff1a; pip install django_cms djangocms -p . mysite安装记录 pip install django-cms Looking in indexes: https://pypi.tun…...

在 UE5 蓝图中配置Actor类型的Asset以作为位置和旋转设置目标

目标 UE5的蓝图的事件图表里面&#xff0c;有一个模块&#xff08;节点&#xff09;如图&#xff0c;这是一个设置Actor的location和rotation量的模块&#xff0c;其中需要接收一个Target作为输入&#xff0c;这个Target应该就是一个在map中具备location和rotation信息的实例化…...

Android 之 kotlin 语言学习笔记四(Android KTX)

一、Android KTX 简介 Android KTX 是包含在 Android Jetpack 及其他 Android 库中的一组 Kotlin 扩展程序。KTX 扩展程序可以为 Jetpack、Android 平台及其他 API 提供简洁的惯用 Kotlin 代码。为此&#xff0c;这些扩展程序利用了多种 Kotlin 语言功能&#xff0c;其中包括&…...

适用于vue3的大屏数据展示组件库DataV(踩坑版)

踩坑版 如果按照官网(https://datav-vue3.jiaminghi.com/)的vue3安装有问题 官网是将dataview/datav-vue3 安装为本地依赖 npm install dataview/datav-vue31、跑起来报错&#xff08;报错信息忘记保留了&#xff09; 有人说找到node_modules&#xff0c; 安装成功后会有这个…...

mysql实现分页查询

文章目录 mysql实现分页查询1. 使用LIMIT和OFFSET2. 使用计算OFFSET的函数&#xff08;适用于动态分页&#xff09;3. 使用MySQL的变量&#xff08;适用于存储过程&#xff09; 获取所有用户数据并分页 mysql实现分页查询 在MySQL中实现分页查询&#xff0c;通常我们会使用LIM…...

Flink checkpoint

对齐检查点 (Aligned Checkpoint) Flink 的分布式快照机制受到 Chandy-Lamport 算法的启发。 其核心元素是数据流中的屏障&#xff08;Barrier&#xff09;。 Barrier 注入 &#xff1a;JobManager 中的 Checkpoint Coordinator 指示 Source 任务开始 Checkpoint。Source 任务…...

【java】在springboot中实现证书双向验证

证书生成 public static void main(String[] args) throws Exception {// 生成密钥对KeyPairGenerator keyPairGenerator KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048);KeyPair keyPair keyPairGenerator.generateKeyPair();// 获取私…...

CppCon 2015 学习:Functional Design Explained

这两个 C 程序 不完全相同。它们的差异在于对 std::cout 的使用和代码格式。 程序 1&#xff1a; #include <iostream> int main(int argc, char** argv) {std::cout << "Hello World\n"; }解释&#xff1a;这个程序是 正确的。std::cout 是 C 标准库中…...

基于3D对象体积与直径特征的筛选

1&#xff0c;目的 筛选出目标3D对象。 效果如下&#xff1a; 2&#xff0c;原理 使用3D对象的体积与直径特征进行筛选。 3&#xff0c;代码解析 3.1&#xff0c;预处理2.5D深度图。 * 参考案例库&#xff1a;select_object_model_3d.hdev * ****************************…...

GIT - 如何从某个分支的 commit创建一个新的分支?

如果上一个Release 分支被污染了&#xff0c;想要还原这个分支最原始的样子&#xff0c;有什么办法或者说该怎么办呢&#xff1f;简单来说&#xff0c;就是如何从某个指定的 commit 创建一个新的 Git 分支&#xff1f; 操作非常简单&#xff01; 命令格式 git branch <ne…...

Claude vs ChatGPT vs Gemini:功能对比、使用体验、适合人群

随着AI应用全面进入生产力场景&#xff0c;市面上的主流AI对话工具也进入“三国杀”时代&#xff1a; Claude&#xff08;Anthropic&#xff09;&#xff1a;新锐崛起&#xff0c;语言逻辑惊艳&#xff0c;Opus 模型被称为 GPT-4 杀手ChatGPT&#xff08;OpenAI&#xff09;&a…...

线程基础编程

早期的计算机只能执行一个任务&#xff0c;一旦任务完成&#xff0c;计算机就会等待下一个任务。这种模型效率低下&#xff0c;无 法充分利用计算机的性能。 随着计算机技术的发展&#xff0c;操作系统开始支持多进程模型&#xff0c;即同时执行多个任务。每个任务被称为一个进…...

DJango项目

一.项目创建 在想要将项目创键的目录下,输入cmd (进入命令提示符)在cmd中输入:Django-admin startproject 项目名称 (创建项目)cd 项目名称 (进入项目)Django-admin startapp 程序名称 (创建程序)python manage.py runserver 8080 (运行程序)将弹出的网址复制到浏览器中…...

深入了解JavaScript当中如何确定值的类型

JavaScript是一种弱类型语言&#xff0c;当你给一个变量赋了一个值&#xff0c;该值是什么类型的&#xff0c;那么该变量就是什么类型的&#xff0c;并且你还可以给一个变量赋多种类型的值&#xff0c;也不会报错&#xff0c;这就是JavaScript的内部机制所决定的&#xff0c;那…...

excel数据对比找不同:6种方法核对两列数据差异

工作中&#xff0c;有时需要核对两列数据的差异&#xff0c;用于对比、复核等。数据较少的情况下差异肉眼可见&#xff0c;数据量较大时用什么方法比较好呢&#xff1f;从个人习惯出发&#xff0c;我整理了6种方法供参考。 6种方法核对两列数据差异&#xff1a; 1、Ctrl G定位…...

基于智能代理人工智能(Agentic AI)对冲基金模拟系统:模范巴菲特、凯西·伍德的投资策略

股票市场涉及众多统计数据和模式。股票交易基于研究和数据驱动的决策。人工智能的使用可以实现流程自动化&#xff0c;让投资者在研究上花费更少的时间&#xff0c;同时提高准确性。这使他们能够更加专注于监督实际交易和服务客户。 顶尖对冲基金经理发挥着至关重要的作用&…...

MySQL数据库基础(二)———数据表管理

前言 上篇文章介绍了MySQL数据库以即数据库的管理 这篇文章将给大家讲解数据表的管理 一、数据表常见操作 数据表常见操作的指令 进入数据库use数据库&#xff1b; 查看当前所有表&#xff1a;show tables; 创建表结构 1.创建表操作 1.1创建表 create table 表名(列名 …...

如何在Lyra中创建一个新的Game Feature Plugin和Experience游戏体验

目录 -1.前言0.预备知识1.创建一个新的Game Feature Plugin插件2.创建Lyra Pawn Data Asset3. 创建Lyra Experience Definition4. 创建自定义关卡5. 设置资产管理器Asset Manager引用6. 创建Lyra User Facing Experience Definition7. 在编辑器中运行测试后记-1.前言 由于转职…...

RDMA简介5之RoCE v2队列

在RoCE v2协议中&#xff0c;RoCE v2队列是数据传输的最底层控制机制&#xff0c;其由工作队列&#xff08;WQ&#xff09;和完成队列&#xff08;CQ&#xff09;共同组成。其中工作队列采用双向通道设计&#xff0c;包含用于存储即将发送数据的发送队列&#xff08;SQ&#xf…...

SAFe/LeSS/DAD等框架的核心适用场景如何选择?

在敏捷开发的规模化实践中&#xff0c;SAFe&#xff08;Scaled Agile Framework&#xff09;、LeSS&#xff08;Large Scale Scrum&#xff09;和DAD&#xff08;Disciplined Agile Delivery&#xff09;是三大主流框架。它们分别以不同的哲学和方法论应对复杂性、协作与交付的…...

鸿蒙应用开发之uni-app x实践

鸿蒙应用开发之uni-app x实践 前言 最近在开发鸿蒙应用时&#xff0c;发现uni-app x从4.61版本开始支持纯血鸿蒙&#xff08;Harmony next&#xff09;&#xff0c;可以直接编译成ArkTS原生应用。这里记录一下开发过程中的一些经验和踩过的坑。 一、环境搭建 1.1 开发工具 …...

window查看SVN账号密码

背景 公司的SVN地址发生迁移&#xff0c;想迁移一下本地SVN地址&#xff0c;后来发现SVN账号密码忘记了。写此文章纯记录。 迁移SVN地址&#xff1a; 找到svn目录点击relocate&#xff0c;输入新的svn地址&#xff0c;如需输入账号密码&#xff0c;输入账号密码即完成svn地址…...

Python训练营---Day44

DAY 44 预训练模型 知识点回顾&#xff1a; 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战&#xff1a;resnet18 作业&#xff1a; 尝试在cifar10对比如下其他的预训练模型&#xff0c;观察差异&#xff0c;尽可能和他人选择的不同尝试通…...

前端项目初始化

​​​​​​ 目录 1. 安装 nvm 2. 配置 nvm 并切换到 Node.js 16.15.0 3. 安装 LightProxy 代理 4. GIT安装 1. 配置用户名和邮箱&#xff08;这些信息将用于您在提交代码时的标识&#xff09;&#xff1a; 2. 生成SSH密钥&#xff08;用于将本地代码仓库与远程存储库连…...

USB扩展器与USB服务器的2个主要区别

在现代办公和IT环境中&#xff0c;连接和管理USB设备是常见需求。USB扩展器&#xff08;常称USB集线器&#xff09;与USB服务器&#xff08;如朝天椒USB服务器&#xff09;是两类功能定位截然不同的解决方案。前者主要解决物理接口数量不足的“近身”连接扩展问题&#xff0c;而…...

第46节:多模态分类(图像+文本)

一、多模态分类概述 多模态分类是指利用来自不同模态(如图像、文本、音频等)的数据进行联合分析和分类的任务。 在当今大数据时代,信息往往以多种形式存在,例如社交媒体上的图片配文字、视频附带字幕、医疗检查中的影像与报告等。单一模态的数据往往只能提供有限的信息,…...

spring获取注册的bean并注册到自定义工厂中管理

背景 在开发的时候&#xff0c;对于同一个对象的按照某个字段的不同有很多的处理方式。想着开发一个类似于工厂模式&#xff0c;由上层工厂统一分配。 由于是基于springboot开发&#xff0c;所以有很多自动注入的对象&#xff0c;如果由工厂统一创建new对象的方式&#xff0c;那…...

IDEA 中 Maven Dependencies 出现红色波浪线的原因及解决方法

在使用 IntelliJ IDEA 开发 Java 项目时&#xff0c;尤其是基于 Maven 的项目&#xff0c;开发者可能会遇到 Maven Dependencies 中出现红色波浪线的问题。这种现象通常表示项目依赖未能正确解析或下载&#xff0c;导致代码提示错误、编译失败等问题。本文将详细分析该问题的常…...