3

我正在使用 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 并且第二行没有导致任何错误时,这怎么可能......

4

3 回答 3

2

HashMap.class是运行时唯一可用的信息objectMapper

它不知道您Map<String, String[]>在左侧声明了 a ,所以它做了大多数 JSON 映射器会做的事情:它假设您想要一个基于 1:1 映射的 JSON 表示,这会导致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

你的诊断不正确。抛出的线ClassCastException

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

而不是后来的数组访问。我相信,在这一行发生错误的原因很明显:map 值根本不是一个数组,但实际上是一个ArrayList.

于 2012-08-21T19:59:44.043 回答
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 回答