我使用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时,以及当第二行不会导致任何错误时,这怎么可能......
答案 0 :(得分:2)
HashMap.class
是objectMapper
在运行时可用的唯一信息。
它不知道您在左侧声明了Map<String, String[]>
,因此它会执行大多数JSON映射器会执行的操作:它假设您需要基于1:1地图的JSON表示形式结果为Map<String, ArrayList<String>>
。
只需使用
List<String> list = args.get(paramName);
String x = list.get(0);
而不是String[] array
和array[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
。