提问人:bob 提问时间:3/9/2023 最后编辑:bob 更新时间:3/9/2023 访问量:426
Jackson @JsonSubTypes - 使用泛型进行多态反序列化
Jackson @JsonSubTypes - Polymorphic deserialization with generics
问:
我正在尝试反序列化这个我无法控制的 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 {
}
}
答:
3赞
Bill Mair
3/9/2023
#1
无法识别类型。List
您的 for 应标识一个包含数组的类。TypeInfo
AccountLedger
AccountLedger
你必须有一个包含列表的类,类似于:
AccountLedgerList {
List<AccountLedger> data;
}
然后 your 标识对象类型:method
List
@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 中包含的类型。这就是我喜欢的编码方式:和.但正如你所说,功能是一样的.DtoType
DtoTypeList
DtoTypeList extends List<DtoType>
评论