一.介绍
Jackson 是 Java 生态中最流行的 JSON 处理库,用于实现 Java 对象与 JSON 数据之间的序列化(Java 对象 → JSON)和反序列化(JSON → Java 对象),同时也支持对 JSON 数据的动态构建、解析和修改。
Jackson 主要由三个核心包组成:
1)jackson-databind:提供 JSON 解析和生成的底层实现;
2)jackson-core:提供对象绑定(Object Mapping)功能,实现 Java 对象与 JSON 之间的自动转换;
3)jackson-annotations:提供 JSON 处理相关的注解类,用于在 Java 类或字段上标注,自定义序列化 / 反序列化行为。

二.基本使用
ObjectMapper 是 Jackson 的 “入口类”,封装了序列化、反序列化和 JSON 操作的核心功能。
序列化与反序列化:
ObjectMapper mapper = new ObjectMapper();
User user=new User("田所",24);
//序列化
String json = mapper.writeValueAsString(user);
//反序列化
User user2 = mapper.readValue(json, User.class);
默认情况下,Jackson 序列化生成的 JSON 是紧凑的单行字符串(无缩进、无换行),比如下面的格式:
{"name":"田所","age":24,"hobbies":["喝红茶"}
我们可以使用 writerWithDefaultPrettyPrinter() 方法生成格式化的字符串(自动添加缩进和换行):
{
"name" : "田所",
"age" : 24,
"hobbies" : [ "喝红茶" ]
}
三.注解
1.字段映射注解
| @JsonProperty | 显式指定 JSON 中的字段名,支持序列化和反序列化双向映射 |
| @JsonAlias | 反序列化时允许 JSON 使用多个别名匹配 Java 字段 |
实例演示:
// 对User的name字段加上@JsonProperty注解
public class User {
@JsonProperty(value = "UserName")
private String name;
private int age;
}
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
User user=new User("田所",24);
String json = mapper.writeValueAsString(user);
JsonNode jsonNode = mapper.readTree(json);
System.out.println(jsonNode);
}

2.数据过滤注解
| @JsonIgnore | 序列化和反序列化时完全忽略该字段(双向生效) |
| @JsonIgnoreProperties | 作用于类,忽略类中多个字段(支持通配符 *),或忽略 JSON 中多余的未知字段 |
| @JsonInclude | 仅在字段满足特定条件时才序列化(反序列化不生效),避免 null / 空值冗余 |
// 对User的name字段加上@JsonProperty注解
public class User {
@JsonIgnore
private String name;
private int age;
}

3.格式转换注解
| @JsonFormat | 控制日期、数字、布尔值的格式,支持时区设置(主要用于序列化) |
| @JsonSerialize | 自定义序列化器:指定一个类实现 JsonSerializer,完全控制字段的序列化逻辑 |
| @JsonDeserialize | 自定义反序列化器:指定一个类实现 JsonDeserializer,处理 JSON 到 Java 字段的转换 |
public class User {
private String name;
private int age;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthDate;
}
4.其他注解
| @JsonCreator | 反序列化时指定构造方法或静态工厂方法,解决无默认构造器或需自定义参数注入的问题 |
public class User {
private String name;
private int age;
@JsonCreator
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
四.JsonNode
JsonNode 是 Jackson 库中表示 JSON 数据节点的基类,用于在内存中抽象和操作 JSON 结构(包括对象、数组、字符串、数字等各种 JSON 元素)。它是 Jackson 处理 JSON 数据的核心接口,所有具体的 JSON 节点类型(如对象、数组、字符串等)都继承自它。
ObjectNode和ArrayNode是JsonNode扩展类(子类),不同的是JsonNode是只读的,ObjectNode和ArrayNode是可修改的。
1.通用方法
1)类型判断方法
| isObject() | 判断是否为 ObjectNode(JSON 对象,{}) |
| isArray() | 判断是否为 ArrayNode(JSON 数组,[]) |
| isNull() | 判断是否为 null 节点(NullNode) |
| isMissingNode() | 判断是否为 “缺失节点”(表示不存在的字段) |
2)值获取方法
| asText() | 转换为字符串(所有类型都可调用) |
| asInt() | 转换为整数(仅适用于数字节点,否则返回 0) |
| asDouble() | 转换为双精度浮点数 |
| asBoolean() | 转换为布尔值("true" 会转为 true) |
| asText(String def) | 转换为字符串,若节点为 null 则返回默认值 |
3)节点访问方法
| get(String fieldName) | 获取 JSON 对象中指定字段的子节点 |
| get(int index) | 获取 JSON 数组中指定索引的子节点 |
| path(String fieldName) | 类似 get(),但字段不存在时返回 MissingNode(避免 null 异常) |
| path(int index) | 类似 get(),但索引越界时返回 MissingNode |
| at(String path) | 接收 JSON Pointer 字符串,返回路径指向的 JsonNode 节点 |
| fields() | 返回 JSON 对象中所有键值对的迭代器 |
| elements() | 返回 JSON 数组中所有元素的迭代器 |
4)其他方法
| size() | 返回节点的 “长度”(数组元素数 / 对象字段数) |
| has(String field) | 判断 JSON 对象是否包含指定字段 |
| hasNonNull(String field) | 判断 JSON 对象是否包含指定字段且值不为 null |
| toString() | 将节点转换为 JSON 格式字符串 |
| deepCopy() | 深拷贝当前节点(避免修改原节点) |
2.JsonNode类
1)JSON和JsonNode相互转换
ObjectMapper mapper = new ObjectMapper();
User user = new User("田所", 24);
String json = mapper.writeValueAsString(user);
// json 转 JsonNode
JsonNode jsonNode = mapper.readTree(json);
//JsonNode 转 json
String json2 = mapper.writeValueAsString(jsonNode);
//JsonNode 转 Java对象
User user2 = mapper.treeToValue(jsonNode, User.class);
2)演示
ObjectMapper mapper = new ObjectMapper();
User user = new User("田所", 24);
String json = mapper.writeValueAsString(user);
JsonNode jsonNode = mapper.readTree(json);
JsonNode name = jsonNode.get("name");
System.out.println(name); //"田所"
String str = name.textValue();
System.out.println(str); //田所
3.ObjectNode类
ObjectNode大部分方法与JsonNode类相同,但是也有不同的:
ObjectMapper mapper = new ObjectMapper();
ObjectNode objectNode = mapper.createObjectNode();
objectNode.put("age",24);
objectNode.remove("age");
objectNode.set("name",mapper.createObjectNode().textNode("田所"));
4.ArrayNode类
ObjectMapper mapper = new ObjectMapper();
ArrayNode arrayNode = mapper.createArrayNode();
arrayNode.add("田所");
arrayNode.insert(0,24);
arrayNode.remove(1);
五.JsonNodeFactory
JsonNodeFactory 是 Jackson 库的核心工厂类,用于创建各种类型的 JsonNode 对象。它提供了统一的接口来生成 JSON 数据在内存中的抽象表示(即 JsonNode 及其子类),是构建和操作 JSON 结构的基础工具。
1.基本使用
JsonNodeFactory 通常通过单例模式使用,即 JsonNodeFactory.instance 获取唯一实例,再调用其方法创建节点:
// 获取单例工厂实例
JsonNodeFactory factory = JsonNodeFactory.instance;
JsonNode textNode = factory.textNode("hello");
ObjectNode userNode = factory.objectNode();
ArrayNode hobbiesNode = factory.arrayNode();
2.常用方法
| objectNode() | 创建空的 JSON 对象节点 |
| arrayNode() | 创建空的 JSON 数组节点 |
| textNode(String s) | 创建字符串节点 |
| numberNode(int n) | 创建整数节点 |
| numberNode(double d) | 创建浮点数节点 |
| booleanNode(boolean b) | 创建布尔节点 |
| nullNode() | 创建 null 节点 |
3775

被折叠的 条评论
为什么被折叠?



