我正在构建一个android应用程序,它在CallLog
类中保存传入/传出呼叫的信息,在SmsLog
类中保存传入/传出smse的信息,以及通过DataLog
类发送/接收的字节。我让它们都实现了一个JsonLog
接口,这样我就可以创建一个ArrayList
的JsonLog
s,希望它可以通过jackson轻松地转换成一个由不同对象组成的json数组。
但是,每当反序列化json文件时,我都会出现此错误:
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
s是out_call
或CallLog
,对于in_sms
s是out_sms
或SmsLog
,对于data
是DataLog
。 最佳答案
您需要在json数据中有一个类型参数或自定义反序列化程序才能完成此工作。
更简单的解决方案是前者,因为您不需要编写那么多代码,而且它可以很容易地扩展,从json数据中,您可以简单地判断哪个条目是什么类型的条目。
类型信息
如果有type
参数:
[
{
"type": "SMS",
"id": 1,
"data": { }
},
{
"type": "CALL",
"id": 2,
"somethingOtherData": {}
}
]
然后在抽象类中可以设置类型映射信息:
@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中不能包含此类型信息,则需要编写自己的反序列化程序。在这个反序列化程序中,您需要根据实际条目来决定这个条目是
JsonLog
还是SmsLog
。关于java - 如何使用Jackson构建不同对象的JSON数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12367128/