Jackson: 使用对象映射注解反序列化内部集合

14
我希望将以下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.
}

谢谢!


使用尽可能多的注释,翻译以下与编程有关的内容。为什么? - Philipp Sander
你能分享你的值对象吗? - Syam S
我添加了我的POJO类。@PhilippSander,这是个人喜好。 - tehAnswer
1个回答

25
你的json中的diets对象不是List,而是一个键值对列表,其键为"diet",值为一个diet对象。所以你有三个选择。
第一种选择是创建一个包装对象DietWrapper,并在User中使用DietWrapper的List:
@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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接