2017-02-16 4 views
0
  1. (String、Object)hashMapを作成し、さまざまな型の値を設定します。
  2. 私はキー「KEY2」の値を取得しようとすると、それは、例外と言って」例外がスローされます

JSON文字列にハッシュマップをシリアライズして(文字列、文字列)のハッシュマップに戻す変換スレッド "main" java.lang.ClassCastException:java.lang.Integerはjava.lang.Stringにキャストできません "。<String、String>ハッシュマップの整数オブジェクト

これを説明する良い方法はありますか?私は(文字列、文字列)のマップを持っていますが、その中の値は必要な文字列ではないという意味ですか?

混乱をお詫び申し上げます。何かが明確でない場合は教えてください。この行で

Map<String, Object> map = new HashMap<>(); 
map.put("key1", "value1"); 
map.put("key2", 99); 
map.put("key3", new Date()); 


JsonUtil jsonUtil = new JsonUtil(); 

String s = jsonUtil.toJson(map); 

HashMap<String, String> newMap = jsonUtil.fromJson(s, HashMap.class); 

String value = newMap.get("key2"); 
+5

ポスト全体を太字にすると、大胆さが無意味になります。 – ChiefTwoPencils

+2

すべてのコンパイラの警告を有効にすることをお勧めします(注釈を付けて警告を抑制しないでください)。これらの警告のうちの1つが、これが起こるとあなたに語ったでしょう。 – VGR

+0

@VGRおそらく、これは、引数HashMap.classが型リテラル(*)として必要ですが、汎用パラメータを取ることができない奇妙なケースです。 – chrylis

答えて

0

String value = newMap.get("key2");

あなたはハッシュマップでkey2の値を取得し、その後、無効であるString型変数valueに代入されます。 key2の値は整数型であるため、これを直接行うことはできません。この値を `Integer型変数に入れることができます。怒鳴るよう:

int value = newMap.get("key2");

それとも、valueに、変数のいずれかのタイプを割り当てることができるようにあなたが一般的な解決策が必要な場合は、あなたがObjectタイプとしてそれを宣言することができます。蛇腹のように:地図

Object value = newMap.get("key2");

+0

マップが指定されていることを意味しますか、それでも要素のタイプを確認する必要がありますか? – xyqshi

+0

を使用してマップを宣言すると、このマップはString型データのKeyおよびValueを受け入れます。マップが宣言されている場合、要素の値の型はStringのみであるため、検証する必要はありません。 – Imran

1

は、キー "KEY2" の値は整数である、99です。例外は、最後の行ではなく、2番目から最後の行にスローされる可能性があります。私はあなたがシリアライズし、その後すぐにデシリアライズされている理由は全くわからないんだけど、あなただけの「99」のような文字列として99をしたい場合は、これを行う方法は次のようになります。

String value = String.valueOf(map.get("key2")); 

シリアライズとデシリアライズはな​​いだろうこの場合には必要である。あなたがfromJson(s, HashMap.class)を呼び出すと

Map<String, String> map = new HashMap<>(); 
map.put("key1", "value1"); 
map.put("key2", String.valueOf(99)); 
map.put(new Date().toString()); 
+0

'Integer'から' String'への暗黙のキャストで例外が*絶対に*最後の行にスローされています。 – chrylis

+1

私の質問は、マップにIntegerがどのように存在するのでしょうかと思いますか? – xyqshi

1

は、あなたがdecoder-に任意の一般的なタイプの情報を提供していない:あなただけの全体の時間のためのMap<String, String>をしたい場合は、

いっそのこと、あなたはこのような何かを行うことができます - それはHashMapであり、その呼び出しからの暗黙の戻り値の型はHashMap<?,?>です。 JSONは文字列キーを想定することができ、デコーダはオブジェクトを "ネイティブ"表現にデコードするために最善を尽くしています。したがって、コンパイラにすべてのキーと値が文字列であると伝えると、不一致があります。

を指定すると、JsonUtilが含まれます。より具体的なアプローチを提供することができます。それ以外の場合は、ストリーム変換のようなものを使用して、すべての値をv.toString()に変換することができます。

+0

私の質問は、なぜマップからIntegerオブジェクトを取得できますか?この行で失敗しなかった理由 HashMap newMap = jsonUtil.fromJson(s、HashMap.class); マップをマップに割り当てようとすると、 – xyqshi

+0

@xyqshi "タイプ消去"について読んでおく必要があります。実行時には 'HashMap'しかありません。 – chrylis

関連する問題