我正在构建一个android应用程序,它在CallLog类中保存传入/传出呼叫的信息,在SmsLog类中保存传入/传出smse的信息,以及通过DataLog类发送/接收的字节。我让它们都实现了一个JsonLog接口,这样我就可以创建一个ArrayListJsonLogs,希望它可以通过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_calls是out_callCallLog,对于in_smss是out_smsSmsLog,对于dataDataLog

最佳答案

您需要在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/

10-09 16:00