2016-07-15 7 views
2

JSONをデシリアライズしてMap<Integer, String>にしています。JSONのオブジェクトキーをJacksonとどのようにして解析しますか?

しかし、keyをプリミティブintに割り当てると、上記のclassCastExceptionが発生します。

ObjectReader reader = new ObjectMapper().reader(Map.class); 
String patternMetadata = "{\"1\":\"name\", \"2\":\"phone\", \"3\":\"query\"}"; 
Map<Integer, String> map = reader.readValue(patternMetadata); 
System.out.println("map: " + map); 
for (Map.Entry<Integer, String> entry : map.entrySet()) 
{ 
    try 
    { 
     System.out.println("map: " + entry.getKey()); 
     int index = entry.getKey(); 
     System.out.println("map**: " + index); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

私はtryブロックに2行目に、このjava.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer例外を取得しています。

私はさらにint index = enty.getKey().intValue()を変更しようとしました。しかし、同じ例外が発生します。

P .: Robolectricフレームワークを使用してAndroidスタジオで実行しています。

+3

JSON特性は*決して* 'int'値です。彼らは常に*文字列です。私はあなたがちょうど文字列を解析する必要があると思う... –

答えて

4

これらのキーは整数ではなく、文字列です。それらの引用符に注意してください。これはJSON(あると思われる)である場合

String patternMetadata = "{\"1\":\"name\", \"2\":\"phone\", \"3\":\"query\"}"; 
// ------------------------^^-^^-----------^^-^^------------^^-^^ 

、オブジェクトのプロパティ名は常に文字列です。

あなたはMap<String, String>が必要ですし、int(必要に応じて)に鍵を解析する必要があります。

+0

しかし、それはどのようにマップに正常に逆シリアル化されますか? – Heisenberg

+1

@Heisenberg:そうではありません、それは 'Map'に逆直列化されます。タイプ消去を忘れないでください。 :-) 'ObjectMapper'は生の' Map'だけを使っています。 'try'ブロックの2行目は、コンパイラが型固有のキャストを挿入したコードの最初の部分です。そのため、そこでは失敗します。 –

2

ジャクソンは、鍵をいくつかのデフォルトのタイプ(またはいくつかの特別な設定を含むカスタムタイプ)にデシリアライズすることができます。

Mapは汎用タイプなので、必要なパラメータ化についてはTypeReferenceを使用する必要があります。

readerは2.5以降廃止予定です。代わりにreaderForを使用してください。適切なTypeReferenceIntegerと入力してMapを入力してObjectReaderを作成します。ジャクソンはあなたの地図のキーとしてIntegerの値を期待しています。

ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Map<Integer, String>>() { 
}); 

フル例

ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Map<Integer, String>>() { 
}); 
String patternMetadata = "{\"1\":\"name\", \"2\":\"phone\", \"3\":\"query\"}"; 
Map<Integer, String> map = reader.readValue(patternMetadata); 
System.out.println("map: " + map); 
for (Map.Entry<Integer, String> entry : map.entrySet()) { 
    try { 
     System.out.println("map: " + entry.getKey()); 
     int index = entry.getKey(); 
     System.out.println("map**: " + index); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

プリント

map: {1=name, 2=phone, 3=query} 
map: 1 
map**: 1 
map: 2 
map**: 2 
map: 3 
map**: 3 
関連する問題