Java 将json转换为对象列表时的ClassCastException
我正在使用库来处理json数据 我创建了一个通用函数,用于将json字符串转换为模型类对象:Java 将json转换为对象列表时的ClassCastException,java,json,Java,Json,我正在使用库来处理json数据 我创建了一个通用函数,用于将json字符串转换为模型类对象: public <T> T parseJsonToObject(String jsonStr, Class<T> clazz) { ObjectMapper mapper = new ObjectMapper(); try { return mapper.readValue(jsonStr, clazz); } catch (Exception
public <T> T parseJsonToObject(String jsonStr, Class<T> clazz) {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.readValue(jsonStr, clazz);
} catch (Exception e) {
}
return null;
}
我得到了服务器响应,这是一个人员列表:
[{"first_name":"John","last_name":"Smith"},{"first_name":"Kate","last_name":"Green"}]
我的字符串jsonPersonstr
保存上述json字符串
现在,我尝试使用我的函数直接将json字符串转换为人员列表:
List<Person> persons = parseJsonToObject(jsonPersonsStr, ArrayList.class);
如何修改我的泛型函数以消除此异常?请尝试:
listOfObjects = mapper.readValue(connection.getInputStream(), new TypeReference<List<Person>>(){});
listOfObjects=mapper.readValue(connection.getInputStream(),newTypeReference(){});
这里的问题是由于Java在泛型上的实现(本例中列出)请检查您的JSON。如果我用你的信息试一下,一切都正常吗 试试这个静态exsample。我定义自己的
个人列表
(无需内容)
公共类JsonDeserializer{
公共静态void main(字符串[]args)引发IOException{
字符串jsonString=“[{\'名字\':\'约翰\',\'姓氏\':\'史密斯\',{\'名字\':\'凯特\',\'姓氏\':'格林\'”;
List persons=parseJsonToObject(jsonString,PersonList.class);
System.out.println(“人员:+人员”);
用于(人:人){
System.out.println(“Person”+Person.firstName+“”+Person.lastName);
}
}
公共静态类PersonList扩展了ArrayList{
}
公共静态T parseJsonToObject(字符串jsonStr,类clazz)引发IOException{
ObjectMapper mapper=新的ObjectMapper();
返回mapper.readValue(jsonStr,clazz);
}
公共静态类人员{
@JsonProperty(“名字”)
私有字符串名;
@JsonProperty(“姓氏”)
私有字符串lastName;
@凌驾
公共字符串toString(){
返回“Person{”+“firstName=“+firstName+”,lastName=“+lastName+”}”;
}
}
}
更新:
我使用maven作为这个json库
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.0.5</version>
<type>jar</type>
</dependency>
com.fasterxml.jackson.core
杰克逊数据绑定
2.0.5
罐子
更新:
还与Codehaus的jackson合作(1.7.3)
org.codehaus.jackson
jackson映射器lgpl
1.7.3
您可能能做的最好的事情是为集合
类型支持一种通用方法,为非集合
类型支持其他方法
下面是通用集合
方法的工作版本:
import org.codehaus.jackson.map.type.TypeFactory;
//...
@SuppressWarnings({ "deprecation", "rawtypes" })
public static <E, T extends Collection> T parseJsonToObject(String jsonStr, Class<T> collectionType, Class<E> elementType) {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.readValue(jsonStr, TypeFactory.collectionType(collectionType, elementType));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
import org.codehaus.jackson.map.type.TypeFactory;
//...
@SuppressWarnings({“弃用”、“原始类型”})
公共静态T parseJsonToObject(字符串jsonStr、类collectionType、类elementType){
ObjectMapper mapper=新的ObjectMapper();
试一试{
返回mapper.readValue(jsonStr,TypeFactory.collectionType(collectionType,elementType));
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
那么你可以这样称呼它:
List<Person> persons = parseJsonToObject(s, ArrayList.class, Person.class);
List persons=parseJsonToObject(s,ArrayList.class,Person.class);
是的,我知道这种方法可以解决问题,但正如我所说的,函数是一个通用函数,它不仅适用于json字符串中的人员列表。我正在寻找一种方法来尽可能地保持函数的通用性并解决我的问题。然后你会遇到问题,因为如果你的clazz是一个列表,它将不起作用,你可以尝试返回新的TypeReference(){},而不是clazz,但是我不确定这是否起作用……可能必须使用TypeReference
。请看这里的答案:我不能使用这个版本的Jackson,因为我的Jackson实际上是另一个第三方库的内置功能。这是一个糟糕的测试。问题不是将列表中的元素强制转换为List
,而是将列表中的元素强制转换为Person
。此测试返回一个对象为Person
(List
)的列表。无法理解为什么这是一个糟糕的测试。它可能返回了一个列表。尝试获取其中一个元素并将其强制转换为人
。这就是异常发生的地方。@superEb好的,你是对的-对不起。我要看看。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.0.5</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-lgpl</artifactId>
<version>1.7.3</version>
</dependency>
import org.codehaus.jackson.map.type.TypeFactory;
//...
@SuppressWarnings({ "deprecation", "rawtypes" })
public static <E, T extends Collection> T parseJsonToObject(String jsonStr, Class<T> collectionType, Class<E> elementType) {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.readValue(jsonStr, TypeFactory.collectionType(collectionType, elementType));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
List<Person> persons = parseJsonToObject(s, ArrayList.class, Person.class);