Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Jackson构建不同对象的JSON数组?_Java_Android_Json_Jackson - Fatal编程技术网

Java 如何使用Jackson构建不同对象的JSON数组?

Java 如何使用Jackson构建不同对象的JSON数组?,java,android,json,jackson,Java,Android,Json,Jackson,我正在构建一个android应用程序,它可以在CallLog类中保存传入/传出呼叫的信息,在SmsLog类中保存传入/传出SMSE的信息,以及通过DataLog类发送/接收的字节。我让他们都实现了一个JsonLog接口,这样我就可以创建一个JsonLogs的ArrayList,希望它可以通过Jackson轻松地转换为不同对象的JSON数组 但是,每当我对JSON文件进行反序列化时,总是会出现以下错误: com.fasterxml.jackson.databind.JsonMappingExcep

我正在构建一个android应用程序,它可以在
CallLog
类中保存传入/传出呼叫的信息,在
SmsLog
类中保存传入/传出SMSE的信息,以及通过
DataLog
类发送/接收的字节。我让他们都实现了一个
JsonLog
接口,这样我就可以创建一个
JsonLog
s的
ArrayList
,希望它可以通过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
,对于
CallLog
s,它是
in\u call
out\u call
,对于
SmsLog
s,和
data
对于
DataLog

您需要在JSON数据中有一个类型参数或一个自定义反序列化程序来完成这项工作

更简单的解决方案是前者,因为您不需要编写那么多代码,而且它可以很容易地扩展,从JSON数据中,您可以简单地判断哪个条目是什么类型的

类型信息 如果您有
类型
参数:

[
  {
    "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

,因为my
SmsLog
CallLog
类都用于保存两种不同的类型(一种用于传入和传出),我想只为传入短信和呼叫以及传出短信和呼叫的日志创建单独的类也会更容易,对吗?如果您希望将条目放在一个JSON数组中,那么这两个解决方案可以工作。如果你可以为短信和通话记录设置单独的数组,那么就容易多了。哦,我之所以把它们都放在一个JSON数组中,是因为我必须将它们作为一个从移动应用程序上传。如果我将它们在各自的JSON数组中分开,我将不得不对服务器进行多个连接和调用。不,您可以这样做:
{“sms”:[],“call”:[]}
^Ah,我明白了。我认为这是我最初的设计,但我想避免嵌套JSON数组和对象,所以现在是这样的:
[{“type”:“in_call”,…},{“type”:“out_sms”,…},…},