Java Jackson:用于反序列化内部集合的对象映射器注释

Java Jackson:用于反序列化内部集合的对象映射器注释,java,json,jackson,Java,Json,Jackson,我想使用尽可能多的注释将以下json转换为java对象 {"user":{ "id":1, "diets":[ {"diet":{ "name":"...", "meals":[] } } ] } } 我在收集饮食方面遇到了麻烦。我试图使用@JsonProperty,但它不能正常工作。地图内部聚合是否有特殊注释 Diet.java @JsonRootName(value = "diet") public clas

我想使用尽可能多的注释将以下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.
}
@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.
}
@JsonRootName(value=“diet”)
公营饮食{
@JsonProperty(value=“name”)
私有字符串名称;
@JsonProperty(value=“膳食”)
私人用餐清单;
私人用户;
//班上的其他人被省略了。
}
User.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.
}
@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.
}
@JsonRootName(value=“user”)
公共类用户{
@JsonProperty(“id”)
私人长id;
@JsonProperty(“饮食”)
私有列表=新的ArrayList();
//班上的其他人被省略了。
}

谢谢

json中的diets对象不是列表。它是一个键值对列表,键值为“diet”,值为diet对象。所以你有三个选择

一种方法是创建一个包装器对象,比如DietWrapper,并在类似用户的应用程序中使用DietWrapper的列表

@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;
}
@JsonRootName(value=“user”)
类用户{
@JsonProperty(value=“id”)
私人长id;
@JsonProperty(value=“饮食”)
私人清单饮食;
//接球手和接球手
}
类包装器{
@JsonProperty(value=“diet”)
饮食;
}
第二种选择是将diest保留为简单的地图列表,如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”)
类用户{
@JsonProperty(value=“id”)
私人长id;
@JsonProperty(value=“饮食”)
私人清单饮食;
//接球手和接球手
}
第三种选择是使用一个自定义反序列化程序,它将忽略您的diet类

@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;
    }
}
@JsonRootName(value=“user”)
类用户{
@JsonProperty(value=“id”)
私人长id;
@JsonProperty(value=“饮食”)
@JsonDeserialize(使用=DietDeserializer.class)
私人清单饮食;
//接球手和接球手
}
类Deserializer扩展JsonDeserializer{
@凌驾
公共列表反序列化(JsonParser JsonParser,
反序列化上下文(DeserializationContext)引发IOException{
ObjectMapper mapper=新的ObjectMapper();
JsonNode=mapper.readTree(jsonParser);
List diets=mapper.convertValue(node.findValues(“diete”),new-TypeReference(){});
回归饮食;
}
}

使用尽可能多的注释。为什么?你能分享你的价值对象吗?我添加了我的POJO类@菲利普斯安德,这是个人的喜好。