【问题标题】:Jackson: Object Mapper annotations to deserialize a inner collectionJackson:反序列化内部集合的对象映射器注释
【发布时间】:2014-08-07 14:48:28
【问题描述】:

我想把下面的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.
}

谢谢!

【问题讨论】:

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

标签: java json jackson


【解决方案1】:

您的 json 中的饮食对象不是列表。它是一个键值对列表,键为“饮食”,并为饮食对象赋值。所以你在这里有三个选择。

一种是创建一个包装器对象,比如 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;
}

第二个选项是保持最简单的地图列表,如 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;
    }
}

【讨论】:

    猜你喜欢
    • 2012-04-12
    • 2011-06-28
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多