将json转换为对象列表时发生ClassCastException [英] ClassCastException when convert json to list of objects

查看:338
本文介绍了将json转换为对象列表时发生ClassCastException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用杰克逊库来处理json数据.

I am using Jackson library to process json data.

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

I have created a generic function to convert json string to a model class object:

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类:

I have a Person class:

public class Person{
   @JsonProperty("first_name")
   private String firstName;

   @JsonProperty("last_name")
   private String lastName;
   //Getter & Setters ...
}

我收到了服务器响应,该响应是一个人员列表:

I got server response which is a List of persons:

[{"first_name":"John","last_name":"Smith"},{"first_name":"Kate","last_name":"Green"}]

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

My String jsonPersonsStr holds the above json string.

现在我尝试使用我的函数将json字符串直接转换为人员列表:

Now I try to use my function to directly convert the json string to a List of Person:

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

但是我有一个例外:

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

如何修改我的通用函数以摆脱此异常?

How to modify my generic function to get rid of this Exception?

推荐答案

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

The best you can probably do is to support one generic method for Collection types, and possibly others for non-Collection types.

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

Here's a working version of the generic Collection method:

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

这篇关于将json转换为对象列表时发生ClassCastException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆