Jackson @JsonSubTypes - 使用泛型进行多态反序列化

Jackson @JsonSubTypes - Polymorphic deserialization with generics

提问人:bob 提问时间:3/9/2023 最后编辑:bob 更新时间:3/9/2023 访问量:426

问:

我正在尝试反序列化这个我无法控制的 json 正文。因为我调用的 API 可以根据“方法”值提供不同的“数据”(对象数组),所以我想到了多态性并使用 .但是,当前的设置给了我一个错误。我已经在另一种情况下使用泛型,其中“数据”是一个对象并且工作正常。但是我无法用对象数组解决这个问题。@JsonSubTypes

com.fasterxml.jackson.databind.exc.MismatchedInputException: 意外令牌 (START_OBJECT),预期START_ARRAY:需要 JSON 数组 包含类的As.WRAPPER_ARRAY类型信息 演示.common.dto.response.data.AccountLedgerResponse

不确定它指的是什么,因为“data”json 属性以“[”开头。

JSON格式

{
    "version": "1.1",
    "result": {
        "signature": "lCteM8iCg++7uyF...TYoY/mc7eUQ6FWNPg==",
        "method": "AccountLedger",
        "data": [{
            "userid": "3839426635",
            "datestamp": "2014-01-30 13:28:45.652299+01",
            "orderid": "3209647863",
            "accountname": "SUSPENSE_ACCOUNT_CLIENT_FUNDS_SWEDEN_ESSE",
            "messageid": "133921",
            "transactiontype": "User deposit of client funds to CLIENT_FUNDS_SWEDEN_ESSE",
            "currency": "EUR",
            "amount": "5.00000000000000000000",
            "gluepayid": "3209647863"
        }, {
            "accountname": "TRANSACTION_FEE_BANK_DEPOSIT",
            "orderid": "3209647863",
            "userid": "3839426635",
            "datestamp": "2014-01-30 13:28:45.652299+01",
            "messageid": "133921",
            "transactiontype": "User deposit of client funds to CLIENT_FUNDS_SWEDEN_ESSE",
            "currency": "SEK",
            "amount": "-3.01",
            "gluepayid": "3209647863"
        }],
        "uuid": "9e4345db-6093-bb35-07d3-e335f1e28793"
    }
}

预期对象:

public record ResultList<T extends ResponseData>(

        @JsonProperty("signature")
        String signature,

        @JsonProperty("uuid")
        UUID uuid,

        @JsonProperty("method")
        Method method,

        @JsonProperty("data")
        @JsonTypeInfo(
                use = JsonTypeInfo.Id.NAME,
                include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
                property = "method")
        @JsonSubTypes({
                @JsonSubTypes.Type(value = AccountLedgerResponse.class, name = "AccountLedger")
        })
        List<T> data) {

    @Builder
    public ResultList {

    }
}
java 数组 json jackson 多态反序列化

评论


答:

3赞 Bill Mair 3/9/2023 #1

无法识别类型。List

您的 for 应标识一个包含数组的类。TypeInfoAccountLedgerAccountLedger

你必须有一个包含列表的类,类似于:

AccountLedgerList {
    List<AccountLedger> data;
}

然后 your 标识对象类型:methodList

@JsonSubTypes({
    @JsonSubTypes.Type(value = AccountLedgerList.class, name = "AccountLedger")
})

评论

0赞 bob 3/9/2023
谢谢你的快速回答。:)但是,在这种情况下,这不也是一个包装列表的对象吗?AccountLedgerList
0赞 bob 3/9/2023
好的,多亏了你:),它似乎起作用了但是我基本上必须让 AccountLedgerList 实现 List 才能使其工作。这是你想暗示的吗?还是有其他方法而不必实现 List?
0赞 Bill Mair 3/9/2023
是的,JsonSubTypes.Type 必须标识要使用的类,而不是 List 中包含的类型。这就是我喜欢的编码方式:和.但正如你所说,功能是一样的.DtoTypeDtoTypeListDtoTypeList extends List<DtoType>