【问题标题】:How to build JSON array of different objects using Jackson?如何使用 Jackson 构建不同对象的 JSON 数组?
【发布时间】:2012-09-11 09:55:04
【问题描述】:

我正在构建一个 android 应用程序,它将传入/传出呼叫的信息保存在 CallLog 类中,传入/传出短信在 SmsLog 类中,以及通过 DataLog 类发送/接收的字节数。我让它们都实现了一个JsonLog 接口,因此我可以创建一个JsonLogs 的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,对于CallLogs,它是in_callout_call,对于in_smsin_sms,对于SmsLogs,data 对于@987654@33 .

【问题讨论】:

    标签: java android json jackson


    【解决方案1】:

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

    【讨论】:

    • 因为我的 SmsLogCallLog 类都用于保存两种不同的类型(一种用于传入和传出),我想为传入日志创建单独的类也会更容易短信和电话,以及发送短信和电话,对吧?
    • 如果您想将条目放在一个 JSON 数组中,那么这两种解决方案都可以。如果您可以为 SMS 和通话记录设置单独的数组,那就容易多了。
    • 哦,我将它们全部放在一个 JSON 数组中的原因是我必须将它们作为一个从移动应用程序上传。如果我将它们分隔在自己的 JSON 数组中,我将不得不建立多个连接并调用服务器。
    • 不,你可以这样做:{ "sms": [ ], "call": [ ] }
    • ^啊,我明白了。我认为这是我最初的设计,但我想避免嵌套 JSON 数组和对象,所以现在是这样的:[{"type": "in_call", ...}, {"type": "out_sms", ...}, ...]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多