使用jackson

时间:2017-02-20 10:09:49

标签: java json jackson

我收到的JSON对象是这样的。

{  
   "Question279":{  
      "ID":"1",
      "Contents":"Some texts here",
      "User":"John",
      "Date":"2016-10-01"
}

我需要将JSON映射到以下java bean。

public class Question {
    @JsonProperty("ID")
    private String id;

    @JsonProperty("Contents")
    private String contents;

    @JsonProperty("User")
    private String user;

    @JsonProperty("Date")
    private LocalDate date;

    //some getters and setters are skipped...
}

另请注意,上述JSON对象Question279中的第一个级别并不总是相同,它取决于用户获取JSON所提供的参数。我无法改变这种情况。

目前我正在使用类似的东西。

ObjectMapper mapper = new ObjectMapper();
String json = "{'Question279':{'ID':'1', 'Contents':'Some texts here', 'User':'John', 'Date':'2016-10-01'}"
Question question = mapper.readValue(json, Question.class);

但是它不起作用,当然,我得到了一个Question课程,里面装满了null。在这种情况下如何使它工作?

2 个答案:

答案 0 :(得分:2)

我建议您为ObjectMapper为每个案例创建一个专门的ObjectReader

String questionKey = "Question279"; // Generate based on parameter used to obtain the json
ObjectReader reader = mapper.reader().withRootName(questionKey).forType(Question.class);
Question q = reader.readValue(json);
... // Work with question instance

答案 1 :(得分:2)

您的JSON定义了集合的映射,因此您可以这样解析它:

ObjectMapper mapper = new ObjectMapper();
Map<String, Question> questions = mapper.readValue(json,
    new TypeReference<Map<String, Question>>(){});
Question question = questions.get("Question279");

new TypeReference<Map<String, Question>>(){}定义了一个扩展TypeReference<Map<String, Question>>的匿名类。它的唯一目的是告诉Jackson它应该将JSON解析为String-&gt; Question对的映射。解析JSON后,您需要从地图中提取所需的问题。