Java Jackson 库

一.介绍

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 节点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值