将json转换为对象列表时出现ClassCastException

时间:2014-04-02 15:30:43

标签: java json

我正在使用Jackson库来处理json数据。

我创建了一个泛型函数来将json字符串转换为模型类对象:

public <T> T parseJsonToObject(String jsonStr, Class<T> 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"}]

我的String jsonPersonsStr拥有上面的json字符串。

现在我尝试使用我的函数直接将json字符串转换为Person of List:

List<Person> persons = parseJsonToObject(jsonPersonsStr, ArrayList.class);

但我得到了例外:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.my.models.Person

如何修改我的泛型函数以摆脱此异常?

3 个答案:

答案 0 :(得分:2)

您可能做的最好的事情是为Collection类型支持一种通用方法,对于非Collection类型支持其他方法。

这是通用Collection方法的工作版本:

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);

答案 1 :(得分:0)

尝试:

listOfObjects = mapper.readValue(connection.getInputStream(), new TypeReference<List<Person>>(){});

这里的问题是由于Java在泛型上的实现(在这种情况下为List)

答案 2 :(得分:0)

请检查您的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<Person> 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<Person> {
    } 

    public static <T> T parseJsonToObject(String jsonStr, Class<T> 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

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.0.5</version>
    <type>jar</type>
</dependency>

<强>更新

也适用于Codehaus的杰克逊(1.7.3)

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-lgpl</artifactId>
    <version>1.7.3</version>
</dependency>