Jackson 详解

目录

前言

        Jackson 是 Java 生态中最流行的 JSON 处理库之一,广泛应用于 RESTful API、数据存储和传输等场景。它提供了高效、灵活的 JSON 序列化和反序列化功能,支持注解、模块化设计和多种数据格式(如 XML、YAML)。本文将详细介绍 Jackson 的核心模块、使用方法、注意事项以及代码示例。

1. Jackson 的核心模块

2. 使用 Jackson

2.1 添加依赖

2.2 核心类:ObjectMapper

2.3 基本使用

序列化

反序列化:

3. 使用注解

3.1 常用注解

3.2 示例代码

4. 高级用法

4.1 处理复杂对象

4.2 自定义序列化和反序列化

4.3 处理多态类型

5. 注意事项

6. 总结


前言

        Jackson 是 Java 生态中最流行的 JSON 处理库之一,广泛应用于 RESTful API、数据存储和传输等场景。它提供了高效、灵活的 JSON 序列化和反序列化功能,支持注解、模块化设计和多种数据格式(如 XML、YAML)。本文将详细介绍 Jackson 的核心模块、使用方法、注意事项以及代码示例。

1. Jackson 的核心模块

Jackson 采用模块化设计,核心模块包括:

  1. jackson-core
    • 提供底层 JSON 解析和生成功能。
    • 包含 JsonParser(解析 JSON)和 JsonGenerator(生成 JSON)。
  2. jackson-annotations
    • 提供丰富的注解,用于控制 JSON 的序列化和反序列化行为。
  3. jackson-databind
    • 提供高级数据绑定功能,将 JSON 数据与 Java 对象相互转换。
  4. jackson-dataformat-xml
    • 支持 XML 格式的序列化和反序列化。
  5. jackson-dataformat-yaml
    • 支持 YAML 格式的序列化和反序列化。

2. 使用 Jackson

2.1 添加依赖

在 Maven 项目中,添加以下依赖:

<dependencies><!-- Jackson 核心模块 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.13.3</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.13.3</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version></dependency><!-- 可选:支持 XML --><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.13.3</version></dependency><!-- 可选:支持 YAML --><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-yaml</artifactId><version>2.13.3</version></dependency>
</dependencies>

2.2 核心类:ObjectMapper

ObjectMapper 是 Jackson 的核心类,用于实现 JSON 与 Java 对象的相互转换。以下是其常用方法:

方法描述
writeValueAsString(Object)将 Java 对象序列化为 JSON 字符串。
readValue(String, Class)将 JSON 字符串反序列化为 Java 对象。
writeValue(File, Object)将 Java 对象序列化到文件中。
readValue(File, Class)从文件中反序列化 JSON 数据。

2.3 基本使用

序列化
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {public static void main(String[] args) throws Exception {User user = new User("John", 30);ObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(user);System.out.println(json); // 输出: {"name":"John","age":30}}
}
class User {private String name;private int age;// 构造函数、Getter 和 Setterpublic User(String name, int age) {this.name = name;this.age = age;}public String getName() { return name; }public void setName(String name) { this.name = name; }public int getAge() { return age; }public void setAge(int age) { this.age = age; }
}
反序列化:
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {public static void main(String[] args) throws Exception {String json = "{\"name\":\"John\",\"age\":30}";ObjectMapper mapper = new ObjectMapper();User user = mapper.readValue(json, User.class);System.out.println(user.getName()); // 输出: JohnSystem.out.println(user.getAge());  // 输出: 30}
}

3. 使用注解

Jackson 提供了丰富的注解,用于控制 JSON 的序列化和反序列化行为。

3.1 常用注解

注解描述
@JsonProperty指定 JSON 字段的名称。
@JsonIgnore忽略字段,不参与序列化和反序列化。
@JsonFormat指定日期、时间等字段的格式化方式。
@JsonInclude控制字段在序列化时的包含规则(如非空字段才序列化)。
@JsonCreator指定反序列化时的构造函数或工厂方法。
@JsonAlias为字段指定多个 JSON 别名,反序列化时可以匹配多个名称。

3.2 示例代码

import com.fasterxml.jackson.annotation.*;
public class User {@JsonProperty("user_name")private String name;@JsonIgnoreprivate String password;@JsonFormat(pattern = "yyyy-MM-dd")private Date birthDate;@JsonInclude(JsonInclude.Include.NON_NULL)private String email;// 构造函数、Getter 和 Setter
}

4. 高级用法

4.1 处理复杂对象

Jackson 支持嵌套对象、集合和映射的序列化和反序列化。

class Address {private String city;private String street;// 构造函数、Getter 和 Setter
}
class User {private String name;private List<Address> addresses;// 构造函数、Getter 和 Setter
}

4.2 自定义序列化和反序列化

通过实现 JsonSerializerJsonDeserializer,可以自定义序列化和反序列化逻辑。

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.io.IOException;
@JsonSerialize(using = CustomSerializer.class)
class User {private String name;// 构造函数、Getter 和 Setter
}
class CustomSerializer extends JsonSerializer<User> {@Overridepublic void serialize(User user, JsonGenerator gen, SerializerProvider serializers) throws IOException {gen.writeStartObject();gen.writeStringField("user_name", user.getName());gen.writeEndObject();}
}

4.3 处理多态类型

使用 @JsonTypeInfo@JsonSubTypes 处理多态类型。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({@JsonSubTypes.Type(value = Dog.class, name = "dog"),@JsonSubTypes.Type(value = Cat.class, name = "cat")
})
abstract class Animal {private String name;// 构造函数、Getter 和 Setter
}
class Dog extends Animal {private String breed;// 构造函数、Getter 和 Setter
}
class Cat extends Animal {private boolean likesCream;// 构造函数、Getter 和 Setter
}

5. 注意事项

  1. 性能优化
    • 重用 ObjectMapper 实例,避免重复创建。
  2. 安全性
    • 反序列化时,避免直接反序列化不可信的 JSON 数据,防止反序列化攻击。
  3. 版本兼容性
    • 确保 jackson-corejackson-annotations 和 jackson-databind 的版本一致。
  4. 空值处理
    • 使用 @JsonInclude(JsonInclude.Include.NON_NULL) 忽略空值字段。

补充:

1. JSON处理库的作用

1.1 Fastjson

Fastjson是阿里巴巴开源的高性能JSON库,主要用于Java对象与JSON字符串之间的序列化反序列化。它支持复杂对象的处理,包括嵌套对象、泛型、集合等,广泛应用于高性能场景。

1.2 org.json

org.json是一个轻量级的JSON处理库,提供了JSON的解析、生成和操作功能。它的API设计简单,适合初学者和快速开发场景。

1.3 json-simple

json-simple是一个简单的JSON处理库,专注于基本的JSON解析和生成。它的API设计非常简洁,适合快速处理简单的JSON数据。


2. 技术原理

2.1 Fastjson

Fastjson的核心技术包括:

  • 高性能解析:通过优化算法和数据结构,Fastjson在解析JSON时速度非常快。
  • 动态类型处理:支持复杂对象的序列化和反序列化,包括泛型、嵌套对象等。
  • 自定义序列化:允许开发者通过注解或自定义序列化器控制JSON的生成和解析。

2.2 org.json

org.json的核心技术包括:

  • 轻量级设计:库的体积较小,适合资源有限的环境。
  • 简单API:提供了JSONObject和JSONArray等核心类,易于上手。
  • 功能齐全:支持JSON的解析、生成和操作。

2.3 json-simple

json-simple的核心技术包括:

  • 简洁API:提供了JSONObject和JSONArray等核心类,API设计非常简洁。
  • 轻量级设计:库的体积较小,适合快速开发场景。
  • 基础功能:支持基本的JSON解析和生成。

3. 示例代码与输出结果

3.1 Fastjson示例

代码:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;public class FastjsonExample {public static void main(String[] args) {// 将Java对象转换为JSON字符串User user = new User("John", 30);String jsonString = JSON.toJSONString(user);System.out.println("Fastjson - JSON String: " + jsonString);// 将JSON字符串转换为Java对象User parsedUser = JSON.parseObject(jsonString, User.class);System.out.println("Fastjson - Parsed User: " + parsedUser);// 操作JSON对象JSONObject jsonObject = JSON.parseObject(jsonString);jsonObject.put("age", 31);System.out.println("Fastjson - Updated JSON: " + jsonObject.toJSONString());}
}class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}// Getters and Setters@Overridepublic String toString() {return "User{name='" + name + "', age=" + age + "}";}
}

 输出结果:

Fastjson - JSON String: {"age":30,"name":"John"}
Fastjson - Parsed User: User{name='John', age=30}
Fastjson - Updated JSON: {"age":31,"name":"John"}

3.2 org.json示例

代码:

import org.json.JSONObject;public class OrgJsonExample {public static void main(String[] args) {// 创建JSON对象JSONObject jsonObject = new JSONObject();jsonObject.put("name", "John");jsonObject.put("age", 30);System.out.println("org.json - JSON Object: " + jsonObject);// 从JSON字符串解析JSON对象String jsonString = "{\"name\":\"John\",\"age\":30}";JSONObject parsedJsonObject = new JSONObject(jsonString);System.out.println("org.json - Parsed JSON Object: " + parsedJsonObject);// 操作JSON对象parsedJsonObject.put("age", 31);System.out.println("org.json - Updated JSON Object: " + parsedJsonObject);}
}

 输出结果:

org.json - JSON Object: {"name":"John","age":30}
org.json - Parsed JSON Object: {"name":"John","age":30}
org.json - Updated JSON Object: {"name":"John","age":31}

3.3 json-simple示例

代码:

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;public class JsonSimpleExample {public static void main(String[] args) throws Exception {// 创建JSON对象JSONObject jsonObject = new JSONObject();jsonObject.put("name", "John");jsonObject.put("age", 30);System.out.println("json-simple - JSON Object: " + jsonObject.toJSONString());// 从JSON字符串解析JSON对象String jsonString = "{\"name\":\"John\",\"age\":30}";JSONParser parser = new JSONParser();JSONObject parsedJsonObject = (JSONObject) parser.parse(jsonString);System.out.println("json-simple - Parsed JSON Object: " + parsedJsonObject);// 操作JSON对象parsedJsonObject.put("age", 31);System.out.println("json-simple - Updated JSON Object: " + parsedJsonObject.toJSONString());}
}

输出结果:

json-simple - JSON Object: {"name":"John","age":30}
json-simple - Parsed JSON Object: {"name":"John","age":30}
json-simple - Updated JSON Object: {"name":"John","age":31}

 

4. 对比与总结

特性Fastjsonorg.jsonjson-simple
性能高性能,适合大数据量处理性能一般性能一般
功能性功能强大,支持复杂对象功能齐全功能基础
易用性API设计简单,易于上手API设计简单,适合初学者API设计简洁,快速上手
体积较大较小较小

结论:

  • 如果需要处理大量的JSON数据,并且对性能有较高要求,Fastjson 是最佳选择。
  • 如果需要一个轻量级且功能齐全的JSON库,org.json 是一个不错的选择。
  • 如果只需要快速处理简单的JSON数据,json-simple 是最简单的选择。

5. 注意事项

  • Fastjson的安全性:Fastjson在过去曾被发现存在一些安全漏洞,建议使用最新版本并关注官方更新。
  • 库的选择:根据项目需求和开发环境选择合适的JSON库,避免过度依赖单一库。

使用前导入对应的库:

6. 总结

Jackson 是 Java 生态中最强大的 JSON 处理库,提供了高效、灵活的序列化和反序列化功能。通过合理使用注解和高级特性,可以满足各种复杂的 JSON 处理需求。无论是 RESTful API、数据存储还是数据传输,Jackson 都是不可或缺的工具。

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

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

相关文章

H.264,H.265,H.266标准技术改进

关于H.264,H.265,H.266相关资料链接&#xff1a; 标准及中文资料链接 视频编码中的主要技术 视频编码的目标是在保证视频质量的前提下&#xff0c;尽可能减少数据量。以下是视频编码中的核心技术&#xff1a; 块划分&#xff08;Block Partitioning&#xff09; 将视频帧划分…

clickhouse安装路径

《ClickHouse安装路径指南》 大家好&#xff0c;今天我们将一起学习如何在电脑上找到和理解ClickHouse的安装路径。这将帮助学生、科研人员以及任何对数据库技术感兴趣的人更好地管理他们的数据查询工作。 ClickHouse是一款列式存储数据库管理系统&#xff08;DBMS&#xff09…

时序数据库 InfluxDB 3.0 版本性能实测报告:写入吞吐量提升效果验证

亮点总结&#xff1a; TSBS 测试表明&#xff0c;对于少于 100 万台设备的数据集&#xff0c;InfluxDB OSS 3.0 的数据写入速度实际上比 InfluxDB OSS 1.8 更慢。 对于 100 万台及以上设备的数据集&#xff0c;InfluxDB OSS 3.0 的数据写入性能才开始超过 InfluxDB OSS 1.8。…

AS32X601双核锁步MCU技术优势分析

AS32X601是国科安芯公司研制的一系列基于32位RISC-V指令集车规级MCU处理器芯片。主频高达180MHz&#xff0c;支持双核锁步架构&#xff0c;基于软错误防护技术加持&#xff0c;显著提高芯片安全性能。产品具有高安全、低失效、多IO、低成本、抗辐照等特点。 一、功能安全与可靠…

基于 LeNet 网络的 MNIST 数据集图像分类

1.LeNet的原始实验数据集MNIST 名称&#xff1a;MNIST手写数字数据集 数据类型&#xff1a;灰度图 &#xff08;一通道&#xff09; 图像大小&#xff1a;28*28 类别数&#xff1a;10类&#xff08;数字0-9&#xff09; 1.通过torchvision.datasets.MNIST下载并保存到本地…

电池综合测试仪:科技赋能,精准守护能源安全

在当今这个科技日新月异的时代&#xff0c;电池作为众多电子设备的心脏&#xff0c;其性能的稳定与高效直接关系到设备的运行质量与使用安全。随着电动汽车、可穿戴设备、储能系统等领域的快速发展&#xff0c;对电池性能的检测与评估提出了更高要求。在此背景下&#xff0c;电…

【Linux 22.4 ubuntu 安装cuda12.1 完整方案】

下载cuda12.1 官网网址 wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda_12.1.1_530.30.02_linux.run sudo sh cuda_12.1.1_530.30.02_linux.run!import! 如果已经安装驱动&#xff0c;则不要选择dirver那项 添加环境变量 vim ~/.b…

实战案例分享:Android WLAN Hal层移植(MTK+QCA6696)

本文将详细介绍基于MTK平台&#xff0c;适配高通&#xff08;Qualcomm&#xff09;QCA6696芯片的Android WLAN HAL层的移植过程&#xff0c;包括HIDL接口定义、Wi-Fi驱动移植以及wpa_supplicant适配过程&#xff0c;涵盖STA与AP模式的常见问题与解决方法。 1. HIDL接口简介 HID…

Greenplum6.19集群搭建

一&#xff0c;安装说明 1.1环境说明 1、首先确定部署的环境&#xff0c;确定下服务器的端口&#xff0c;一般默认是22的端口&#xff1b; 2、当前这份文档是服务器处于10022端口下部署的&#xff08;现场生产环境要求&#xff0c;22端口在生产环境存在安全隐患&#xff09;&…

电商项目-秒杀系统(四)秒杀异步下单防止重复秒杀

一、 防止恶意刷单解决 在生产场景下&#xff0c;可能会有一些人会恶意访问当前网站&#xff0c;来进行恶意的刷单。这样会造成当前系统出现一些业务上的业务混乱&#xff0c;出现脏数据&#xff0c;或者造成后端访问压力大等问题。 一般要解决这个问题的话&#xff0c;前端可…

原生android 打包.aar到uniapp使用

1.原生安卓里面引入uniapp官方提供的包文件&#xff1a; uniapp-v8-release.aar 2.提供uniapp调用的接口&#xff0c;新建类文件继承UniModule&#xff0c; package com.dermandar.panoramal;import com.scjt.lib.certlib;import io.dcloud.feature.uniapp.annotation.UniJSM…

Android 多用户相关

Android 多用户相关 本文主要记录下android 多用户相关的adb 命令操作. 1: 获取用户列表 命令: adb shell pm list users 输出如下: Users:UserInfo{0:机主:c13} running默认只有一个用户, id为0 &#xff0c;用户状态为运行 2: 创建新用户 命令&#xff1a; adb shell …

基于Spring Boot的高校就业招聘系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

前端安全面试题汇总及参考答案

目录 简述 XSS 攻击的原理及三种常见类型(存储型、反射型、DOM 型) 如何在前端防御 XSS 攻击?列举编码、过滤、CSP 策略的具体实现方式 富文本编辑器场景下如何安全处理用户输入的 HTML 内容? 如何通过 HttpOnly 属性增强 Cookie 安全性?它与 XSS 防御的关系是什么? …

Linux驱动开发(1.基础创建)

序言&#xff1a;从高层逻辑到底层硬件的回归 在当今的软件开发中&#xff0c;我们习惯于用高级语言构建抽象层——通过框架、库和云服务快速实现功能。这种“软逻辑”的便利性让开发效率倍增&#xff0c;却也逐渐模糊了我们对计算机本质的认知&#xff1a;一切代码终将落地为…

Gradle本地配置文件分享

Gradle本地配置文件分享 allprojects {repositories {mavenLocal()maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" }ma…

deepseek 本地部署

deepseek 本地部署 纯新手教学&#xff0c;手把手5分钟带你在本地部署一个私有的deepseek&#xff0c;再也不用受网络影响。流畅使用deepseek&#xff01;&#xff01;&#xff01; 如果不想看文章&#xff0c;指路&#xff1a;Deep seek R1本地部署 小白超详细教程 &#xff0…

HTML学习笔记(全)

基本结构 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title></title> </head> <body></body> </html> 基本标签元素 标题&#xff08;heading&#xff09; <h1>一级标题</h1> &…

腾讯云对象存储服务(COS)

腾讯云对象存储服务&#xff08;COS&#xff09; 安全、可扩展、低成本的云存储解决方案 腾讯云 对象存储服务&#xff08;COS&#xff0c;Cloud Object Storage&#xff09; 是一种高可靠、高性能、可扩展的云存储服务&#xff0c;专为海量非结构化数据&#xff08;如图片、…

从ETL到数仓分层:大数据处理的“金字塔”构建之道

在当今数据驱动的时代&#xff0c;大数据处理已成为企业决策和业务优化的核心。而ETL&#xff08;Extract, Transform, Load&#xff09;作为数据处理的基石&#xff0c;其背后的数仓分层理念更是决定了数据处理的效率与质量。本文将深入探讨ETL工作中的数仓分层理念&#xff0…