Jackson - De-Serialize json with dynamic key

I have the following 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 make it out when the date changes every time? I have to use Jackson to parse.

+6
source share
1 answer

If you have dynamic keys, you can use Map<K, V> . The type of keys and values ​​depends on your needs.


The simplest approach is Map<String, Object> . For this you need TypeReference<T> :

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

Assuming your keys are valid, you can use Map<LocalDate, Object> .

The following dependency is required:

 <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>${jackson.version}</version> </dependency> 

Then you can:

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

Finally, you can map the values ​​of dynamic keys to a Java class. Let me call him 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 } 

And then you can have Map<LocalDate, Foo> :

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

All Articles