我正在使用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
如何修改我的泛型函数以摆脱此异常?
答案 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>