Jackson Databind
Jackson Databind 是建立在 streaming API 之上的对象映射层:把 Java 类型、属性模型和格式解析器连接起来,完成树模型、序列化和反序列化。
本册问题地图
Section titled “本册问题地图”Jackson Databind 的核心是把“不完整的运行时类型信息”恢复成可执行的对象映射计划:
- 为什么需要 JavaType?
Class<?>丢失集合元素和泛型参数,JavaType把List<User>、Map<String, Order>等结构保留下来,供序列化器和反序列化器选择。 - 属性发现和真正读写如何分工? 先从字段、方法、构造器和注解建立属性模型,再由读写器消费模型;发现阶段的问题会表现为字段缺失,读写阶段的问题则表现为格式或类型错误。
- 为什么缓存 serializer/deserializer? 反射、注解解析和类型构造成本高,缓存把它们从每次数据处理移到首次解析;但动态 Module 和配置变化会影响缓存命中边界。
- Module 改变了什么? 它可以注册自定义类型处理器、命名策略或修改器,把全局映射规则注入
ObjectMapper;多个 Module 的顺序可能改变最终行为。 - 反序列化失败如何定位? 先确认 token 流,再确认 JavaType,再看属性模型、构造器、转换器和未知字段策略,不能只看最后一行异常。
本册聚焦 Jackson 2.x 的 com.fasterxml.jackson.databind。Jackson 3.x 使用 tools.jackson.databind,两代 API 和包名不能混读。
| 项 | 值 |
|---|---|
| 仓库 | FasterXML/jackson-databind |
| 主要分支 | 2.x |
| 2.x 包名 | com.fasterxml.jackson.databind |
| 上游依赖 | jackson-core、jackson-annotations |
| 核心入口 | ObjectMapper |
它解决什么问题
Section titled “它解决什么问题”- 用
JavaType保留集合、Map、泛型参数等运行时类型信息。 - 通过
SerializerProvider和DeserializerCache缓存昂贵的类型处理器构造过程。 - 把字段、Getter、Setter、Creator 和注解合并成统一的
BeanPropertyDefinition。 - 让 Module 在不修改核心代码的情况下注册序列化器、反序列化器和 Modifier。
ObjectMapper#readValue/writeValue:用户 API 如何进入读写管线。TypeFactory#constructType:Class、TypeReference到JavaType的转换。SerializerProvider#findValueSerializer:序列化器查找、缓存和上下文解析。DeserializerCache#findValueDeserializer:反序列化器构造和缓存。POJOPropertiesCollector:从 Java 成员和注解收集逻辑属性。SimpleModule#setupModule:Module 如何向SetupContext注册扩展。