3

ObjectMapper を使用して JSON 文字列をマップに変換していますが、値を取得しようとすると ClassCastException が発生します。

Map<String,String[]> args = objectMapper.readValue(jsonString, HashMap.class);
String[] array = args.get(paramName);

それからやって

String x = array[0];

与える

java.lang.ClassCastException: java.util.ArrayList cannot be cast to [Ljava.lang.String

ArrayListではなくString []を明確に指定し、2行目でエラーが発生しない場合、これはどうすればよいでしょうか...

4

3 に答える 3

2

HashMap.classobjectMapper実行時に利用できる唯一の情報です。

Map<String, String[]>左側でを宣言したことはわからないため、ほとんどのJSONマッパーが行うことを実行します。JSONの1:1マップベースの表現が必要であると想定しているため、結果は。になりMap<String, ArrayList<String>>ます。

使用するだけ

List<String> list = args.get(paramName);
String x = list.get(0);

との代わりString[] arrayarray[0]

さらに良いことに、JSONをではなく実際のモデルクラスにマッピングしますHashMap

于 2012-08-21T19:14:53.673 に答える
0

オブジェクト マッパーは、使用したパラメーター化された型情報に従いません (実際にはできません)。引数として渡すクラスについてのみ認識します。ジェネリック型を使用する方がはるかに良いでしょう。

実際に返されるのは次のとおりです。

Map<Object, Object> args = objectMapper.readValue(jsonString, HashMap.class);

引数に何かを使用するようにコードを変更してから、クラスのキャストを行い、それに応じてチェックすることをお勧めします。

例えば:

Map<Object, Object> args = new LinkedHashMap<Object, Object>();
Object value = args.get("foo");
String x;
if (value instanceof String[]) {
    String[] array = (String[])value;
    x = array[0];
} else if(value instanceof List) {
    List<Object> list = (List<Object>) value;
    x = String.valueOf(list.get(0));
} else {
    //error handling
}
...
于 2012-08-21T19:19:04.437 に答える
0

あなたの診断は間違っています。スローする行ClassCastException

String[] array = args.get(paramName);

後の配列アクセスではありません。この行でエラーが発生する理由は明らかだと思います。マップ値は単純に配列ではなく、実際にはArrayList.

于 2012-08-21T19:59:44.043 に答える