teh*_*wer 10 java json jackson
我想使用尽可能多的注释将以下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.
}
谢谢!
Sya*_*m S 20
json中的饮食对象不是List.它是一个键值对的列表,具有关键的"饮食"和价值饮食对象.所以你有三个选择.
一个是创建一个包装器对象说DietWrapper并在User中使用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>
@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;
    }
}