class Person<T> implements java.io.Serializable {
private String name;
private T car;
... //setter
...// getter
}
class BenzCar implements java.io.Serializable {
private String color;
private int price;
... //setter
...// getter
}
public static void main (String[] args) {
String info = "{"name":"zhangsan", "car":{"color":"black","price":"500000"}}";
ObjectMapper mapper = new ObjectMapper();
Person<Benz> person = mapper.convertValue(info, Person.class);
}
抛出下面异常
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.rick.log4j.entrypoint.Demo$Person` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('{"name":"zhangsan", "car":{"color":"black","price":"500000"}}')
at [Source: UNKNOWN; line: -1, column: -1]
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1438)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1027)
at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:370)
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:314)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1351)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:170)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:161)
at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:3733)
... 2 more
使用Jackson 反序列化含有泛型的对象时,如果没有给Jackson提供足够的信息反序列化, Jackson会默认使用LinkedHashMap,以下代码运行时异常:
String s = mapper.writeValueAsString(person);
Person p1 = mapper.readValue(s, Person.class);
Benz car = (Benz) p1.getCar();//编译通过,运行报错
System.out.println(car);
Exception in thread "main" java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.rick.file.entrypoint.Benz
at com.rick.file.entrypoint.Demo.main(Demo.java:39)
Process finished with exit code
解决办法是在反序列化时明确指定类型,如下所示:
Person<Benz> p2 = mapper.readValue(s, new TypeReference<Person>() {});
System.out.println(p2.getCar());