我想将以下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<Meal> 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<Diet> diets = new ArrayList<Diet>();
// Rest of the class omitted.
}
谢谢!
答案 0 :(得分:17)
json中的饮食对象不是List。它是一个键值对的列表,具有关键的“饮食”和价值饮食对象。所以你有三个选择。
一个是创建一个包装器对象说DietWrapper并在用户中使用List of diet wrapper
@JsonRootName(value = "user")
class User {
@JsonProperty(value = "id")
private long id;
@JsonProperty(value = "diets")
private List<DietWrapper> diets;
//Getter & Setters
}
class DietWrapper {
@JsonProperty(value = "diet")
Diet diet;
}
第二个选项是保持最简单的地图列表,如List&gt;
@JsonRootName(value = "user")
class User {
@JsonProperty(value = "id")
private long id;
@JsonProperty(value = "diets")
private List<Map<String, Diet>> diets;
//Getter & Setters
}
第三种选择是使用自定义反序列化器,它会忽略你的饮食类。
@JsonRootName(value = "user")
class User {
@JsonProperty(value = "id")
private long id;
@JsonProperty(value = "diets")
@JsonDeserialize(using = DietDeserializer.class)
private List<Diet> diets;
//Getter & Setters
}
class DietDeserializer extends JsonDeserializer<List<Diet>> {
@Override
public List<Diet> deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext) throws IOException {
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(jsonParser);
List<Diet> diets = mapper.convertValue(node.findValues("diet"), new TypeReference<List<Diet>>() {});
return diets;
}
}