杰克逊 - 使用动态密钥对json进行序列化 [英] Jackson - De-Serialize json with dynamic key

查看:194
本文介绍了杰克逊 - 使用动态密钥对json进行序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下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"
  }
}

如果每次更改日期,我该如何解析?我必须使用杰克逊进行解析。

How can I parse this, when the date will change everytime? I must use Jackson to do the parsing.

推荐答案

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

When you have dynamic keys, you can use a Map<K, V>. The type of the keys and the values depend on your needs.

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

The simplest approach is Map<String, Object>. You'll need a TypeReference<T> for that:

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>>() {});

这篇关于杰克逊 - 使用动态密钥对json进行序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆