Jackson 使用方法详解

Jackson 是 Java 生态中最流行的 JSON 处理库,也是 Spring Boot 的默认 JSON 解析器。它提供了高性能的 JSON 序列化(对象 → JSON)和反序列化(JSON → 对象)功能。以下是 Jackson 的全面使用指南。


1. 基础依赖

Maven 依赖

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.0</version> <!-- 使用最新版本 -->
</dependency>

Spring Boot 项目无需手动引入,默认已集成。


2. 核心类:ObjectMapper

ObjectMapper 是 Jackson 的核心类,负责序列化和反序列化操作。

import com.fasterxml.jackson.databind.ObjectMapper;ObjectMapper mapper = new ObjectMapper();

3. 基础用法

3.1 序列化(对象 → JSON)

Person person = new Person("Alice", 30);
String json = mapper.writeValueAsString(person);
// 输出: {"name":"Alice","age":30}

3.2 反序列化(JSON → 对象)

String json = "{\"name\":\"Alice\",\"age\":30}";
Person person = mapper.readValue(json, Person.class);
System.out.println(person.getName()); // 输出: Alice

3.3 序列化到文件/从文件反序列化

// 写入文件
mapper.writeValue(new File("person.json"), person);// 从文件读取
Person person = mapper.readValue(new File("person.json"), Person.class);

4. 常用注解

Jackson 提供注解来控制序列化/反序列化行为。

4.1 字段控制

注解作用示例
@JsonProperty自定义 JSON 字段名@JsonProperty("user_name")
@JsonIgnore忽略字段@JsonIgnore private String password
@JsonInclude仅包含非空字段@JsonInclude(Include.NON_NULL)

4.2 日期格式化

public class Event {@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date createTime;
}

4.3 忽略未知字段

@JsonIgnoreProperties(ignoreUnknown = true)
public class Person {private String name;
}

5. 复杂对象处理

5.1 嵌套对象

public class Order {private String orderId;private Person customer; // 嵌套对象
}String json = "{\"orderId\":\"123\",\"customer\":{\"name\":\"Alice\"}}";
Order order = mapper.readValue(json, Order.class);

5.2 集合类型

// List 序列化/反序列化
List<Person> people = Arrays.asList(new Person("Alice"), new Person("Bob"));
String json = mapper.writeValueAsString(people);List<Person> parsedList = mapper.readValue(json, new TypeReference<List<Person>>() {});

5.3 Map 类型

Map<String, Person> personMap = new HashMap<>();
personMap.put("alice", new Person("Alice"));String json = mapper.writeValueAsString(personMap);
Map<String, Person> parsedMap = mapper.readValue(json, new TypeReference<Map<String, Person>>() {});

6. 高级配置

6.1 美化输出(Pretty Print)

String prettyJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(person);

6.2 自定义序列化/反序列化

// 自定义序列化器
public class CustomSerializer extends JsonSerializer<Person> {@Overridepublic void serialize(Person value, JsonGenerator gen, SerializerProvider provider) {gen.writeString(value.getName().toUpperCase());}
}// 注册自定义序列化器
SimpleModule module = new SimpleModule();
module.addSerializer(Person.class, new CustomSerializer());
mapper.registerModule(module);

7. 与 Spring Boot 集成

Spring Boot 自动配置了 ObjectMapper,可通过以下方式自定义:

7.1 全局配置

@Configuration
public class JacksonConfig {@Beanpublic ObjectMapper objectMapper() {ObjectMapper mapper = new ObjectMapper();mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);return mapper;}
}

7.2 REST 控制器示例

@RestController
public class PersonController {@GetMapping("/person")public Person getPerson() {return new Person("Alice", 30); // 自动转为JSON}@PostMapping("/person")public Person createPerson(@RequestBody Person person) { // 自动从JSON反序列化return person;}
}

8. 性能优化建议

  1. 重用 ObjectMapper
    避免重复创建,推荐作为单例使用。

  2. 使用 TypeReference 处理泛型

    List<Person> people = mapper.readValue(json, new TypeReference<List<Person>>() {});
    
  3. 启用缓存

    mapper.enable(SerializationFeature.USE_EQUALITY_FOR_OBJECT_ID);
    

9. 常见问题

Q1: 如何处理循环引用?

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class User {private int id;private User friend; // 可能循环引用
}

Q2: 日期格式全局配置

mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));

Q3: 忽略 null 字段

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

总结

Jackson 提供了强大而灵活的 JSON 处理能力:

  • 基础操作ObjectMapper + readValue/writeValue
  • 注解控制@JsonProperty@JsonIgnore
  • 高级特性:自定义序列化、泛型处理、Spring 集成

掌握这些用法后,你可以高效安全地处理任何 JSON 数据场景!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/80836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络入侵检测】基于源码分析Suricata的统计模块

【作者主页】只道当时是寻常 【专栏介绍】Suricata入侵检测。专注网络、主机安全,欢迎关注与评论。 1. 概要 👋 在 Suricata 的配置文件中,stats 节点用于配置统计信息相关的参数,它的主要作用是控制 Suricata 如何收集和输出统计数据,帮助用户了解 Suricata 的运行状态和…

回归预测 | Matlab实现DBO-LightGBM蜣螂算法优化轻量级梯度提升机多输入单输出回归预测,作者:机器学习之心

回归预测 | Matlab实现DBO-LightGBM蜣螂算法优化轻量级梯度提升机多输入单输出回归预测&#xff0c;作者&#xff1a;机器学习之心 目录 回归预测 | Matlab实现DBO-LightGBM蜣螂算法优化轻量级梯度提升机多输入单输出回归预测&#xff0c;作者&#xff1a;机器学习之心预测效果…

风力发电领域canopen转Profinet网关的应用

在风力发电领域&#xff0c;开疆canopen转Profinet网关KJ-PNG-205的应用案例通常涉及将风力涡轮机内部的CANopen网络与外部的Profinet工业以太网连接起来。这种转换网关允许风力发电场的控制系统通过Profinet协议收集和监控涡轮机的状态信息&#xff0c;同时发送控制命令。 风力…

因特网和万维网

本文来源 &#xff1a;腾讯元宝 因特网&#xff08;Internet&#xff09;和万维网&#xff08;World Wide Web&#xff0c;简称WWW&#xff09;是紧密相关但完全不同的两个概念&#xff0c;它们的核心区别如下&#xff1a; 本质不同​​ ​​因特网&#xff08;Internet&#…

Visual Studio 技能:调整软件界面布局

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;Windows编程&#xff1a;在VS2019里面&#xff0c;调整代码字体大…

LeetCode 热题 100_最小路径和(92_64_中等_C++)(多维动态规划)

LeetCode 热题 100_最小路径和&#xff08;92_64&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;多维动态规划&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;多维动态规划&…

Sql刷题日志(day6)

一、笔试 1、insert ignore&#xff1a;在插入数据时忽略主键冲突或其他唯一性约束冲突。 如果插入的记录会导致主键冲突&#xff08;如 actor_id 已存在&#xff09;&#xff0c;该语句不会报错&#xff0c;而是直接忽略插入操作 语法&#xff1a; INSERT IGNORE INTO tab…

Java多线程入门案例详解:继承Thread类实现线程

本文通过一个简单案例&#xff0c;讲解如何通过继承 Thread 类来实现多线程程序&#xff0c;并详细分析了代码结构与运行机制。 一、前言 在 Java 中&#xff0c;实现多线程主要有两种方式&#xff1a; 继承 Thread 类 实现 Runnable 接口 本文以继承 Thread 类为例&#x…

Netty在线客服系统落地方案

本文不讲然后代码方面的东西&#xff0c;只聊方案&#xff01;&#xff01; 这方案基于 Spring Boot 2.6、Netty、MyBatis Plus、Redis 构建的一套支持 单体应用 的在线客服系统。 系统支持客户自由与后台客服实时聊天、客服未在线钉钉提醒通知客服、消息已读未读标记、消息已…

SDK游戏盾、高防IP、高防CDN三者的区别与选型指南

在网络安全防护领域&#xff0c;SDK游戏盾、高防IP和高防CDN是常见的解决方案&#xff0c;但各自的功能定位、技术实现和适用场景差异显著。本文将通过对比核心差异&#xff0c;帮助您快速理解三者特点并选择适合的防护方案。 一、核心功能定位 SDK游戏盾 功能核心&#xff1a…

GRPO有什么缺点,如何改进?

一、GRPO的核心原理与设计目标 Group Relative Policy Optimization(GRPO)是DeepSeek团队提出的一种强化学习算法,旨在解决传统PPO(Proximal Policy Optimization)在大语言模型(LLM)训练中的资源消耗问题。其核心创新在于 通过组内相对奖励替代价值函数(Critic Model)…

登高架设作业指的是什么?有什么安全操作规程?

登高架设作业是指在高处从事脚手架、跨越架架设或拆除的作业。具体包括以下方面&#xff1a; 脚手架作业 搭建各类脚手架&#xff0c;如落地式脚手架、悬挑式脚手架、附着式升降脚手架等&#xff0c;为建筑施工、设备安装、高处维修等作业提供安全稳定的工作平台。对脚手架进行…

前端实现商品放大镜效果(Vue3完整实现)

前端实现商品放大镜效果&#xff08;Vue3完整实现&#xff09; 前言 在电商类项目中&#xff0c;商品图片的细节展示至关重要。放大镜效果能显著提升用户体验&#xff0c;允许用户在不跳转页面的情况下查看高清细节。本文将基于Vue3实现一个高性能的放大镜组件&#xff0c;完整…

【C++11特性】Lambda表达式(匿名函数)

一、函数对象 在C中&#xff0c;我们把所有能当作函数使用的对象当作函数对象。 一般来说&#xff0c;如果我们列出一个对象&#xff0c;而它的后面又跟有由花括号包裹的参数列表&#xff0c;就像fun(arg1, arg2, …)&#xff0c;这个对象就被称为函数对象。函数对象大致可分为…

大模型在肝硬化腹水风险预测及临床方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与数据来源 二、肝硬化及大模型相关理论基础 2.1 肝硬化概述 2.2 大模型技术原理 2.3 大模型在医疗领域的应用现状 三、大模型预测肝硬化腹水术前风险 3.1 术前风险因素分析 3.2 大模型预测术前…

MCP:如何通过模型控制推理助力AI模型实现“深度思考”?

MCP:如何通过模型控制推理助力AI模型实现“深度思考”? | Echo_Wish专栏 大家好,我是Echo_Wish,一个在人工智能和Python领域深耕的技术达人。今天咱们聊一个相对前沿的技术话题——MCP (Model Control Propagation),它是如何帮助AI模型“深度思考”,让机器变得更加智能的…

c++初识

C 基础入门 本人写了很多c的服务器和客户端代码&#xff0c;这篇文章主要是想帮助初学者快速入门c.这样就能快速阅读我的源码&#xff0c;其实不难c只是比c多了些特性&#xff0c;其实不难&#xff0c;你们就理解为有更多的方式修改函数和调用函数的方式和重写函数 C 基础入门…

JVM 生产环境问题定位与解决实战(八):实战篇——正则表达式回溯引发的CPU 100%

本文已收录于《JVM生产环境问题定位与解决实战》专栏&#xff0c;完整系列见文末目录 1. 引言 在上一篇文章中&#xff0c;我们深入剖析了OSSClient泄漏引发的FullGC风暴全链路排查过程。本文聚焦另一个经典线上问题——正则表达式回溯导致的CPU 100%。在Java应用中&#xff0…

100天精通Python挑战总览 | 零基础到应用实战!

目录 ✨ 为什么发起100天挑战&#xff1f;✨整体学习路线规划第一阶段&#xff5c;基础篇&#xff08;第1天 - 第50天&#xff09;第二阶段&#xff5c;应用篇&#xff08;第51天 - 第100天&#xff09;Web开发篇爬虫篇数据分析篇AI入门篇 &#x1f3c6;为什么这么划分&#xf…

C++编译之(5)-cmake/CMakeLists.txt的编译使用教程

C++编译之(5)-cmake/CMakeLists.txt的编译使用教程 上一节,点这里 1、如何查看cmake的配置参数 那么如何查看当前配置的参数呢,我们可以使用-L参数 cmake .. -L # cmake .. -LAH完全使用命令行,则可以通过多次重复使用cmake … -DOPTION1=ON -D OPTION2=ON配置制定选项;并…