2016-02-17 13 views
5

Ich habe die folgende JSON:Jackson - deserialisieren json mit dynamischer Schlüssel

{ 
    "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" 
    } 
} 

Wie kann ich diese analysieren, wenn das Datum wird jedes Mal ändern? Ich muss Jackson benutzen, um das Parsing zu machen.

+1

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

Antwort

4

Wenn Sie dynamische Schlüssel haben, können Sie eine Map<K, V> verwenden. Die Art der Schlüssel und die Werte hängen von Ihren Bedürfnissen ab.


Der einfachste Ansatz ist Map<String, Object>. Sie erhalten eine TypeReference<T> dafür brauchen:

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

Unter der Annahme, dass Ihre Schlüssel gültige Daten, könnten Sie eine Map<LocalDate, Object> verwenden.

Die folgende Abhängigkeit benötigt:

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

Dann können Sie haben:

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

Schließlich Sie die Werte des dynamischen Schlüssels zu einer Java-Klasse zuordnen können. Nennen wir es 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 
} 

Und dann können Sie eine Map<LocalDate, Foo> haben:

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

Schöne Antwort, vor allem, wenn Sie den * Endlich * Teil hinzugefügt haben, so ist es Sollte gemacht werden. –

Verwandte Themen