ObjectMapper
是 Jackson 库中非常重要的一个类,它是 JSON 和 Java 对象之间进行序列化与反序列化的核心工具。ObjectMapper
的底层实现是基于 Jackson 的数据绑定模型,它将 Java 对象与 JSON 数据转换为互通格式。
1. ObjectMapper
的设计与核心功能
ObjectMapper
继承自 ObjectCodec
,并提供了多种方法来进行 JSON 与 Java 对象之间的转换。它的核心工作是通过 序列化(Serialization) 和 反序列化(Deserialization) 来实现的。
核心方法:
- 序列化:
writeValue()
、writeValueAsString()
等方法将 Java 对象转换为 JSON。 - 反序列化:
readValue()
、readTree()
等方法将 JSON 数据转换为 Java 对象。
2. 底层实现细节
2.1. 序列化过程
在序列化过程中,ObjectMapper
通过 SerializerProvider
和 Serializer
将 Java 对象转换成 JSON。
writeValue()
方法是ObjectMapper
中最常用的序列化方法。它将 Java 对象转换为 JSON,并将其输出到指定的输出流或文件。writeValueAsString()
是writeValue()
的变体,它将 Java 对象转换为 JSON 字符串。
public void writeValue(JsonGenerator gen, Object value) throws IOException {if (value == null) {_serializeNull(gen);return;}// 获取对应的序列化器JsonSerializer<Object> serializer = _serializerProvider.findValueSerializer(value.getClass(), _serializationConfig);// 使用序列化器将 Java 对象转换为 JSONserializer.serialize(value, gen, _serializationConfig);
}
JsonGenerator
:负责将数据写入 JSON 输出流,它是 Jackson 序列化过程的核心接口,控制生成的 JSON 结构。_serializerProvider.findValueSerializer()
:这个方法用于从序列化器缓存中获取对应 Java 类型的JsonSerializer
,如果缓存中没有,它会动态创建一个。
2.2. 反序列化过程
在反序列化过程中,ObjectMapper
通过 DeserializationContext
和 JsonDeserializer
将 JSON 转换成 Java 对象。
readValue()
方法是ObjectMapper
中最常用的反序列化方法。它将 JSON 数据转换为 Java 对象。readTree()
是readValue()
的变体,它将 JSON 数据转换为JsonNode
树结构,便于动态处理。
public <T> T readValue(JsonParser p, JavaType valueType) throws IOException {if (p.getCurrentToken() == JsonToken.VALUE_NULL) {return null;}// 获取对应的反序列化器JsonDeserializer<Object> deserializer = _deserializerProvider.findValueDeserializer(valueType, _deserializationConfig);// 使用反序列化器将 JSON 转换为 Java 对象return deserializer.deserialize(p, _deserializationContext);
}
4. 树模型和流式处理
Jackson 提供了两种常用的数据处理方式:
- 树模型:通过
JsonNode
可以方便地动态操作 JSON 数据。readTree()
方法将 JSON 数据解析为JsonNode
树模型,你可以像操作树结构一样操作 JSON 数据。 - 流式处理:
JsonGenerator
和JsonParser
提供了高效的流式处理方式,适用于处理大规模数据或实时数据流。
public JsonNode readTree(JsonParser p) throws IOException {return _deserializationContext.readTree(p);
}