杰克逊 - 使用动态键反序列化JSON

18
{"name": "John", "age": 30, "city": "New York"}

我有以下JSON:

{
  "2016-01-23": {
    "downloads": 4,
    "re_downloads": 1,
    "updates": 0,
    "returns": 0,
    "net_downloads": 4,
    "promos": 0,
    "revenue": "0.00",
    "returns_amount": "0.00",
    "edu_downloads": 0,
    "gifts": 0,
    "gift_redemptions": 0,
    "date": "2016-01-23"
  },
  "2016-01-24": {
    "downloads": 1,
    "re_downloads": 1,
    "updates": 0,
    "returns": 0,
    "net_downloads": 1,
    "promos": 0,
    "revenue": "0.00",
    "returns_amount": "0.00",
    "edu_downloads": 0,
    "gifts": 0,
    "gift_redemptions": 0,
    "date": "2016-01-24"
  }
}

每次日期都会改变,我该如何解析它?我必须使用Jackson来进行解析。


1
请访问以下链接以了解有关Java Jackson JSON解析为Map<String, String>的信息:https://dev59.com/-WjWa4cB1Zd3GeqPojti 或者 http://www.mkyong.com/java/how-to-convert-java-map-to-from-json-jackson/ - zloster
1个回答

19

当您拥有动态键时,可以使用 Map<K, V>。键和值的类型取决于您的需求。


最简单的方法是使用 Map<String, Object>。您需要一个TypeReference<T>

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map = 
    mapper.readValue(json, new TypeReference<Map<String, Object>>() {});
假设您的键是有效日期,您可以使用 Map<LocalDate, Object>
需要以下依赖项:
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>${jackson.version}</version>
</dependency>

然后你可以拥有:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
Map<LocalDate, Object> map =
    mapper.readValue(json, new TypeReference<Map<LocalDate, Object>>() {});

最后,你可以将动态键的值映射到Java类中。我们称之为 Foo

public class Foo {

    private Integer downloads;

    @JsonProperty("re_downloads")
    private Integer reDownloads;

    private Integer updates;

    private Integer returns;

    @JsonProperty("net_downloads")
    private Integer netDownloads;

    private Integer promos;

    private String revenue;

    @JsonProperty("returns_amount")
    private String returnsAmount;

    @JsonProperty("edu_downloads")
    private Integer eduDownloads;

    private Integer gifts;

    @JsonProperty("gift_redemptions")
    private Integer giftRedemptions;

    // Default constructor, getters and setters omitted
}

然后您可以拥有一个Map<LocalDate, Foo>:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
Map<LocalDate, Foo> map =
        mapper.readValue(json, new TypeReference<Map<LocalDate, Foo>>() {});

2
很好的答案,特别是你添加了最后的部分,这就是应该的做法。 - cнŝdk

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