Java 使用字符串[]时的ClassCastException

Java 使用字符串[]时的ClassCastException,java,arraylist,classcastexception,Java,Arraylist,Classcastexception,我正在使用ObjectMapper将JSON字符串转换为映射,但在尝试检索值时得到ClassCastException: Map<String,String[]> args = objectMapper.readValue(jsonString, HashMap.class); String[] array = args.get(paramName); 给予 当我清楚地指定String[]而不是ArrayList,并且第二行没有引起任何错误时,这怎么可能呢…HashMap.clas

我正在使用ObjectMapper将JSON字符串转换为映射,但在尝试检索值时得到ClassCastException:

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


当我清楚地指定String[]而不是ArrayList,并且第二行没有引起任何错误时,这怎么可能呢…

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

它不知道您在左侧声明了一个
Map
,因此它做了大多数JSON映射程序都会做的事情:它假设您需要一个基于1:1映射的JSON表示,这将导致一个
Map

只用

List<String> list = args.get(paramName);
String x = list.get(0);
List List=args.get(paramName);
字符串x=list.get(0);
而不是
String[]array
array[0]


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

对象映射器不遵守(实际上不能)您使用的参数化类型信息。它只知道您作为参数传入的类。您最好使用泛型类型

你实际上得到的是:

Map<Object, Object> args = objectMapper.readValue(jsonString, HashMap.class);
Map 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
}
...
Map args=newlinkedhashmap();
对象值=args.get(“foo”);
字符串x;
if(字符串[]的值instanceof){
字符串[]数组=(字符串[])值;
x=数组[0];
}else if(列表的值实例){
列表=(列表)值;
x=String.valueOf(list.get(0));
}否则{
//错误处理
}
...

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

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

而不是以后的阵列访问。我认为,这一行出现错误的原因是显而易见的:map值根本不是数组,而是一个
ArrayList

ArrayList是Java对动态数组的实现(因此有一个底层的
String[]
来存储值)但我怀疑这就是你在这里遇到的。实际的类型在运行时被删除。我认为yoru
objectMapper
返回一个
Map
,而不是
Map
@dasblinkenlight不应该在前一行启动ClassCastException(
String[]array=args.get(paramName);
)@SJuan76不一定,因为类型参数的信息在运行时不可用。我无法更改第一行上的参数类型:Map。。然后,当执行List List=args.get(param)时,我期望得到“无法从字符串[]转换为List”。。。如果您在
objectMapper.readValue(…)
后面紧跟着
System.out.println(args)
,它会打印什么?
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
}
...
String[] array = args.get(paramName);