如何用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
相关产品推荐
相关产品推荐

