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

如何用ObjectMapper将JSON数组直接反序列化到嵌套对象字段

问题

现有如下JSON数据:

{    
    "id": "XXXXX",    
    "url": null,    
    "arrival": [        
        {          
            "from": "13:00",          
            "to": "14:00",          
            "max": 100        
        },        
        {          
            "from": "14:00",          
            "to": "15:00",          
            "max": 200        
        }      
    ]
}

需要将其反序列化为以下Java类:

public class Information{
  private String id;
  private String url;
  private ClassContainingArrivals var; 
}

其中ClassContainingArrivals类包含List<HoursAndMax> arrival字段,用于存储JSON中arrival数组的信息。原本计划在Information类中新增List<HoursAndMax> arrival中间字段,后续再赋值给var.arrival来保证objectMapper.readValue正常工作。

请问是否可以通过配置ObjectMapper或为var字段添加注解,直接将JSON中的arrival数组反序列化到var.arrival,无需新增中间字段?

解决方案

完全可以通过Jackson的注解实现,无需新增中间字段,以下是两种常用方案:

方案一:自定义@JsonSetter处理赋值逻辑

在Information类中给关联方法添加@JsonSetter注解,直接把JSON的arrival数组映射到var.arrival:

public class Information{
  private String id;
  private String url;
  private ClassContainingArrivals var; 

  @JsonSetter("arrival")
  public void setArrival(List<HoursAndMax> arrivalList) {
      if (var == null) {
          var = new ClassContainingArrivals();
      }
      var.setArrival(arrivalList);
  }

  // 保留id、url、var的常规getter/setter
}

ObjectMapper会自动识别这个注解,将JSON中的arrival数组传入该方法,完成var.arrival的赋值。

方案二:用@JsonProperty映射嵌套属性

通过在Information类中添加对应arrival字段的读写方法,并标注@JsonProperty,直接关联到var.arrival:

public class Information{
  private String id;
  private String url;
  private ClassContainingArrivals var; 

  @JsonProperty("arrival")
  public List<HoursAndMax> getArrival() {
      return var != null ? var.getArrival() : null;
  }

  @JsonProperty("arrival")
  public void setArrival(List<HoursAndMax> arrivalList) {
      if (var == null) {
          var = new ClassContainingArrivals();
      }
      var.setArrival(arrivalList);
  }

  // 保留var字段的getter/setter(如果需要)
}

这种方式相当于把JSON的arrival字段直接绑定到var.arrival的读写操作上,反序列化时会自动完成赋值。

基础类要求

要确保ClassContainingArrivals和HoursAndMax类有完整的字段及对应的getter/setter:

public class ClassContainingArrivals {
    private List<HoursAndMax> arrival;

    public List<HoursAndMax> getArrival() { return arrival; }
    public void setArrival(List<HoursAndMax> arrival) { this.arrival = arrival; }
}

public class HoursAndMax {
    private String from;
    private String to;
    private int max;

    public String getFrom() { return from; }
    public void setFrom(String from) { this.from = from; }
    public String getTo() { return to; }
    public void setTo(String to) { this.to = to; }
    public int getMax() { return max; }
    public void setMax(int max) { this.max = max; }
}

内容的提问来源于stack exchange,提问作者cesarknbv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:53:25