2016-02-17 4 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" 
    } 
} 

日は毎回変わるとき、どのように私は、これを解析することができますか?私は解析を行うためにジャクソンを使う必要があります。

+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

素晴らしい答え、特に*最後に*の部分を追加すると、これは行われるべきです。 –

関連する問題