Jackson:Object Mapper注释用于反序列化内部集合

我想使用尽可能多的注释将以下json转换为java对象。

{"user":{ "id":1, "diets":[ {"diet":{ "name":"...", "meals":[] } } ] } } 

我在收集饮食方面遇到麻烦。 我试图使用@JsonProperty但它无法正常工作。 地图内部聚合是否有特殊注释?

Diet.java

  @JsonRootName(value = "diet") public class Diet { @JsonProperty(value="name") private String name; @JsonProperty(value="meals") private List meals; private User user; // Rest of the class omitted. } 

User.java

 @JsonRootName(value = "user") public class User { @JsonProperty("id") private long id; @JsonProperty("diets") private List diets = new ArrayList(); // Rest of the class omitted. } 

谢谢!

你的json中的饮食对象不是List。 它是一个键值对的列表,具有关键的“饮食”,并且重视饮食对象。 所以你有三个选择。

一个是创建一个包装器对象说DietWrapper并在User中使用List of diet wrapper

 @JsonRootName(value = "user") class User { @JsonProperty(value = "id") private long id; @JsonProperty(value = "diets") private List diets; //Getter & Setters } class DietWrapper { @JsonProperty(value = "diet") Diet diet; } 

第二个选项是保持最简单的地图列表,如List>

 @JsonRootName(value = "user") class User { @JsonProperty(value = "id") private long id; @JsonProperty(value = "diets") private List> diets; //Getter & Setters } 

第三种选择是使用自定义反序列化器,它会忽略你的饮食类。

 @JsonRootName(value = "user") class User { @JsonProperty(value = "id") private long id; @JsonProperty(value = "diets") @JsonDeserialize(using = DietDeserializer.class) private List diets; //Getter & Setters } class DietDeserializer extends JsonDeserializer> { @Override public List deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { ObjectMapper mapper = new ObjectMapper(); JsonNode node = mapper.readTree(jsonParser); List diets = mapper.convertValue(node.findValues("diet"), new TypeReference>() {}); return diets; } }