将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