Jackson实现“零配置”序列化,核心依赖反射机制自动发现并访问Java对象结构,无需手动声明字段映射;默认扫描public字段或getter方法推断属性名与值,注解用于修饰反射行为而非替代,Spring Boot通过JacksonAutoConfiguration预设反射策略实现开箱即用。
Jackson 实现“零配置”序列化,核心依赖反射机制自动发现并访问 Java 对象的结构,无需手动声明字段映射。它不靠注解驱动,而是默认启用反射扫描——只要字段可被访问(public 或有 getter/setter),就能自动读写。
反射如何触发序列化流程
ObjectMapper 在调用
时,会通过反射获取目标类的 Class 对象,再遍历其所有非静态、非 transient 的字段(或更常见的是:查找符合 JavaBean 规范的 getter 方法)。例如:
→ 推断出属性名
,再读取实际值。
对 public 字段,直接 getDeclaredField().get(obj)
对 private 字段 + getter,调用 Method.invoke(obj) 获取值
序列化时默认忽略无 getter 的 private 字段(除非显式开启
)
反射与注解协同工作的底层逻辑
注解不是替代反射,而是“修饰反射行为”。比如
并不改变字段本身,而是在反射读取到
字段后,由
将其序列化为键
;
则让反射扫描阶段跳过该字段或方法。
Find JSON Path Online
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
下载
:反射取值后,先判断是否为 null,再决定是否写入
:反射拿到 Date 对象后,交由定制的序列化器格式化
所有注解解析都在反射构建元数据(
)时完成,属于“一次反射 + 多次复用”
为什么 Spring Boot 能做到零配置
Spring Boot 的
会注册一个默认的
,并预设了标准反射策略:启用
、
等。这意味着只要你的类是普通 POJO(含 getter/setter),Spring MVC 返回对象时,
就能靠反射+内置规则直接生成 JSON,完全无需额外代码。
不加任何注解 → 按字段名/Getter 名小写驼峰转 JSON key
字段类型支持自动识别:String、int、List、Map、嵌套对象等
遇到 LocalDateTime 等 JSR-310 类型,会自动注册
提供反射兼容的序列化器
反射带来的限制与应对
纯反射虽方便,但也有边界。例如 final 字段、无参构造器缺失、泛型擦除导致的类型丢失,都可能引发异常或错误结果。
反序列化失败常见于:类没有无参构造器 → Jackson 反射 newInstance() 抛
泛型集合如
需传
,否则反射只能拿到
,无法还原泛型参数
解决方式不是关闭反射,而是补全契约:加
标注构造器,或用
writeValueAsString()getName()nameMapperFeature.USE_GETTERS_AS_SETTERS@JsonProperty("user_name")nameBeanPropertyWriter"user_name"@JsonIgnore@JsonInclude(NON_NULL)@JsonFormat(pattern = "yyyy-MM-dd")POJOPropertiesCollectorJacksonAutoConfigurationObjectMapperMapperFeature.AUTO_DETECT_GETTERSUSE_ANNOTATIONSMappingJackson2HttpMessageConverterJacksonDatabindModuleInstantiationExceptionListTypeReferenceList.class@JsonCreatorobjectMapper.readValue(json, new TypeReference>(){})
