2

我正在构建一个 android 应用程序,用于保存类中传入/传出呼叫、CallLog类中传入/传出 SMSSmsLog以及通过类发送/接收的字节的信息DataLog。我让它们都实现了一个JsonLog接口,这样我就可以创建一个s ArrayListJsonLog希望它可以通过 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_callor out_callfor CallLogs, in_smsor out_smsfor SmsLogs, and datafor DataLog

4

1 回答 1

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 中不能包含此类型信息,则需要编写自己的反序列化器。在该反序列化器中,您需要从实际条目中决定该条目是 anSmsLog还是 a CallLog

于 2012-09-11T09:59:37.890 回答