我正在构建一个Android应用程序,用于保存CallLog
类中的传入/传出呼叫,SmsLog
类中的传入/传出SMS以及通过{{1}发送/接收的字节的信息} .class。我让他们都实现了DataLog
接口,这样我就可以创建一个JsonLog
ArrayList
个,希望它可以通过Jackson轻松转换为不同对象的JSON数组。
但是,每当我反序列化JSON文件时,我都会收到此错误:
JsonLog
我该如何解决这个问题?所有com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance
of com.project.pojos.JsonLog, problem: abstract types either need to be mapped
to concrete types, have custom deserializer, or be instantiated with additional
type information
类都有一个字符串属性JsonLog
,对于type
,in_call
或out_call
,可以是CallLog
或in_sms
out_sms
的{{1}}和SmsLog
的{{1}}。
答案 0 :(得分:3)
您需要在JSON数据中使用类型参数或自定义反序列化器才能完成这项工作。
更简单的解决方案是前者,因为您不需要编写那么多代码,并且可以轻松扩展,并且可以从JSON数据中简单地告诉哪个条目是什么类型。
如果您有type
参数:
[
{
"type": "SMS",
"id": 1,
"data": { }
},
{
"type": "CALL",
"id": 2,
"somethingOtherData": {}
}
]
然后在您的抽象JsonLog
类中,您可以设置类型映射信息:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@Type(name = "SMS", value = SmsLog.class),
@Type(name = "CALL", value = CallLog.class)
})
public abstract class JsonLog {
}
如果您的JSON中不能包含此类型信息,则需要编写自己的反序列化程序。在该反序列化器中,您需要从实际条目中确定此条目是SmsLog
还是CallLog
。