使用String []时出现ClassCastException

时间:2012-08-21 19:07:04

标签: java arraylist classcastexception

我使用ObjectMapper将JSON字符串转换为Map,但在尝试检索值时遇到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

当我清楚地指定String []而不是ArrayList时,以及当第二行不会导致任何错误时,这怎么可能......

3 个答案:

答案 0 :(得分:2)

HashMap.classobjectMapper在运行时可用的唯一信息。

它不知道您在左侧声明了Map<String, String[]>,因此它会执行大多数JSON映射器会执行的操作:它假设您需要基于1:1地图的JSON表示形式结果为Map<String, ArrayList<String>>

只需使用

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

而不是String[] arrayarray[0]

更好的是,将您的JSON映射到实际的模型类,而不是HashMap

答案 1 :(得分: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
}
...

答案 2 :(得分:0)

您的诊断不正确。抛出ClassCastException的行是

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

而不是后来的数组访问。我认为,此行发生错误的原因显而易见:地图值不是数组,但实际上是ArrayList