Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将json转换为对象列表时的ClassCastException_Java_Json - Fatal编程技术网

Java 将json转换为对象列表时的ClassCastException

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

我正在使用库来处理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; 
}
我得到了服务器响应,这是一个人员列表:

[{"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);