You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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()。之前用自定义反序列化器实现,但过程繁琐且维护性差。

想问:

  1. 是否可以通过注解实现嵌套属性的扁平映射?比如类似@JsonProperty(name = "count", root = "stats/button")的写法?
  2. 对于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 17:37:23