2016-02-17 72 views
5

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

如何可以解析此,當日期將改變每次?我必須用Jackson來解析。

+1

http://stackoverflow.com/questions/12337409/java-jackson-json-parse-into-mapstring-字符串或http://www.mkyong.com/java/how-to-convert-java-map-to-from-json-jackson/ – zloster

回答

4

當您有動態密鑰時,您可以使用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>>() {}); 
+1

很好的答案,特別是當你添加*最後*部分,這是它是如何需要被完成。 –