2

CallLogクラス内の着信/発信通話、クラス内の着信/発信 SMS SmsLog、およびクラスを介して送受信されたバイトに関する情報を保存する Android アプリを構築していますDataLog。Jackson を介してさまざまなオブジェクトの JSON 配列に簡単に変換できることを期待してJsonLog、単一ArrayListのs を作成できるように、それらすべてにインターフェイスを実装させました。JsonLog

ただし、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またはout_callfor CallLogin_smsまたはout_smsfor SmsLog、およびdataforDataLogです。

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 に含めることができない場合は、独自のデシリアライザーを作成する必要があります。そのデシリアライザーでは、実際のエントリから、このエントリが か かを判断する必要がありSmsLogますCallLog

于 2012-09-11T09:59:37.890 に答える