将json转换为对象列表时出现ClassCastException
我正在使用Jackson库来处理json数据。
我创建了一个通用函数来将json字符串转换为模型类对象:
public T parseJsonToObject(String jsonStr, Class clazz) { ObjectMapper mapper = new ObjectMapper(); try { return mapper.readValue(jsonStr, clazz); } catch (Exception e) { } return null; }
我有一个Person类:
public class Person{ @JsonProperty("first_name") private String firstName; @JsonProperty("last_name") private String lastName; //Getter & Setters ... }
我得到了服务器响应,这是一个人员列表:
[{"first_name":"John","last_name":"Smith"},{"first_name":"Kate","last_name":"Green"}]
My String jsonPersonsStr
包含上面的json字符串。
现在我尝试使用我的函数直接将json字符串转换为Person of List:
List persons = parseJsonToObject(jsonPersonsStr, ArrayList.class);
但是我得到了例外:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.my.models.Person
如何修改我的generics函数来摆脱这个exception?
您可能做的最好的事情是为Collection
类型支持一种通用方法,对于非Collection
类型可能支持其他方法。
这是通用Collection
方法的工作版本:
import org.codehaus.jackson.map.type.TypeFactory; //... @SuppressWarnings({ "deprecation", "rawtypes" }) public static T parseJsonToObject(String jsonStr, Class collectionType, Class elementType) { ObjectMapper mapper = new ObjectMapper(); try { return mapper.readValue(jsonStr, TypeFactory.collectionType(collectionType, elementType)); } catch (Exception e) { e.printStackTrace(); } return null; }
然后你会这样称呼:
List persons = parseJsonToObject(s, ArrayList.class, Person.class);
尝试:
listOfObjects = mapper.readValue(connection.getInputStream(), new TypeReference>(){});
这里的问题是由于Java在generics上的实现(在这种情况下是List)
请检查您的JSON。 如果我尝试使用您的信息,一切都有效吗?
试试这个静态例子。 我定义自己的PersonList
(不需要内容)
public class JsonDeserializer { public static void main(String[] args) throws IOException { String jsonString = "[{\"first_name\":\"John\",\"last_name\":\"Smith\"},{\"first_name\":\"Kate\",\"last_name\":\"Green\"}]"; List persons = parseJsonToObject(jsonString, PersonList.class); System.out.println("Persons: " + persons); for (Person person : persons) { System.out.println("Person " + person.firstName + " " + person.lastName); } } public static class PersonList extends ArrayList { } public static T parseJsonToObject(String jsonStr, Class clazz) throws IOException { ObjectMapper mapper = new ObjectMapper(); return mapper.readValue(jsonStr, clazz); } public static class Person { @JsonProperty("first_name") private String firstName; @JsonProperty("last_name") private String lastName; @Override public String toString() { return "Person{" + "firstName=" + firstName + ", lastName=" + lastName + '}'; } } }
更新 :
我使用maven这个json lib
com.fasterxml.jackson.core jackson-databind 2.0.5 jar
更新 :
也适用于Codehaus的jackson(1.7.3)
org.codehaus.jackson jackson-mapper-lgpl 1.7.3