如何用Jackson注解将嵌套JSON反序列化为扁平POJO?
JSON反序列化为扁平POJO的注解实现方案
现有POJO类
class Bean { private Instant created; private Instant updated; private String name; private int count; }
输入JSON结构
{ "time_created": <custom timestamp>, "time_updated": <custom timestamp>, // 其他数据... "person": { "name": "John" // 其他数据... }, "stats": { "button": { "count": 5 // ... } // ... } }
需求与疑问
希望将上述JSON反序列化为扁平结构的POJO,无需定义冗余嵌套类,直接通过bean.getCount()获取嵌套在stats.button下的count值,而非多层调用bean.getStats().getButton().getCount()。之前用自定义反序列化器实现,但过程繁琐且维护性差。
想问:
- 是否可以通过注解实现嵌套属性的扁平映射?比如类似
@JsonProperty(name = "count", root = "stats/button")的写法? - 对于
Instant类型字段,直接在字段上添加@JsonDeserialize(using = CustomInstantDeserializer.class)注解来实现自定义反序列化是否可行?
解决方案
1. 嵌套属性的扁平映射注解实现
Jackson框架原生支持通过点分隔的路径映射嵌套JSON属性到扁平POJO字段,无需自定义root属性。直接使用@JsonProperty注解指定完整嵌套路径即可:
class Bean { // ...其他字段 @JsonProperty("stats.button.count") private int count; @JsonProperty("person.name") private String name; }
Jackson会自动从JSON的stats.button.count路径取值,填充到Bean的count字段,实现直接调用bean.getCount()的需求。
2. Instant类型的自定义反序列化
你提到的@JsonDeserialize(using = CustomInstantDeserializer.class)写法完全可行,直接在对应Instant字段上添加该注解即可:
class Bean { @JsonDeserialize(using = CustomInstantDeserializer.class) @JsonProperty("time_created") private Instant created; @JsonDeserialize(using = CustomInstantDeserializer.class) @JsonProperty("time_updated") private Instant updated; // ...其他字段 }
如果多个字段需使用同一反序列化器,也可通过注册Jackson模块全局配置,避免重复添加注解,但字段级注解写法已满足需求且更灵活。
内容的提问来源于stack exchange,提问作者EarthTurtle
相关产品推荐
相关产品推荐

