跳转到内容

整体架构

Jackson Databind 不是 JSON parser。它把 streaming API 与 Java 类型模型连接起来,核心职责是选择、构造、缓存并调用 serializer 或 deserializer。

先给答案:Jackson Databind 不是 JSON parser

Section titled “先给答案:Jackson Databind 不是 JSON parser”

Jackson Databind 不是 JSON parser。它把 streaming API 与 Java 类型模型连接起来,核心职责是选择、构造、缓存并调用 serializer 或 deserializer。 正文沿“主链路 -> 读路径 -> 写路径”展开:先确认入口和状态归属,再跟踪控制流或数据流的推进,最后落到对外可观察的结果。

主要失效边界集中在“ObjectMapper 可共享,但运行中修改全局配置会改变后续调用行为;应用通常应在启动期完成配置。、serializer 缓存解决的是构造成本,不代表业务对象或输出结果可以跨线程共享。、日期、字段名和类型 id 的具体行为还取决于配置和 Module。”这些场景。它们破坏的是容量、顺序、并发或生命周期前提;排查时应先确认状态是否仍由正确对象持有,再核对推进条件和清理路径。

ObjectMapper
├─ ObjectReader / ObjectWriter
├─ DeserializationConfig / SerializationConfig
├─ TypeFactory -> JavaType
├─ SerializerProvider -> SerializerFactory -> JsonSerializer
└─ DeserializationContext -> DeserializerFactory -> JsonDeserializer
↓
JsonParser / JsonGenerator

ObjectMapper 持有配置、工厂、类型工厂和缓存入口,但单次读写状态通常由 DefaultDeserializationContext、SerializerProvider 及 reader/writer 派生对象承载。

readValue 创建或复用 parser,再把目标类型交给 DeserializationContext。上下文通过 DeserializerCache 找到根 deserializer,随后调用 JsonDeserializer#deserialize 消费 token。容器和 POJO deserializer 会继续为元素、属性和构造参数查找子 deserializer。

writeValue 建立 generator 和序列化上下文,SerializerProvider 根据运行时或声明类型寻找 serializer。Bean serializer 通常由 BeanSerializerFactory 根据 BeanDescription 和属性 writer 组合出来,最后把值写入 generator。

层 责任 替代方案的代价
ObjectMapper 高层入口与共享配置 把所有状态塞进 mapper 会放大线程安全和重入风险
JavaType 结构化保存泛型信息 只传 Class 会丢失 List<T>、Map<K,V> 的参数
SerializerProvider 查找、缓存、上下文和 null 处理 让每个 serializer 自己缓存会造成重复和生命周期混乱
streaming API 增量 token 读写 直接反射对象无法支持流式输入和多格式后端
  • ObjectMapper 可共享,但运行中修改全局配置会改变后续调用行为;应用通常应在启动期完成配置。
  • serializer 缓存解决的是构造成本,不代表业务对象或输出结果可以跨线程共享。
  • 日期、字段名和类型 id 的具体行为还取决于配置和 Module。

面试锚点

  • ObjectMapper 为什么不是每次请求都应该 new?
  • JavaType 和 Class<?> 的职责差异是什么?
  • parser/generator 与 serializer/deserializer 如何分层?