jackson - java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to XXX

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());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值