2016-02-17 14 views
5

Ho il seguente JSON:Jackson - De-Serialize JSON con dinamica chiave

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

Come posso analizzare questo, quando la data cambierà ogni volta? Devo usare Jackson per fare l'analisi.

+1

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

risposta

4

Se si dispone delle chiavi dinamiche , è possibile utilizzare uno Map<K, V>. Il tipo di chiavi e i valori dipendono dalle tue esigenze.


L'approccio più semplice è Map<String, Object>. Avrete bisogno di un TypeReference<T> per questo:

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

Supponendo che le chiavi sono date valide, si potrebbe usare un Map<LocalDate, Object>. è necessario

Il seguente dipendenza:

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

allora si può avere:

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

Infine, è possibile mappare i valori delle chiavi dinamiche per una classe Java. Chiamiamolo 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 
} 

E poi si può avere un Map<LocalDate, Foo>:

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

Bella risposta, soprattutto quando hai aggiunto la parte * Finally *, ecco come dovrebbe essere fatto. –

Problemi correlati