我正在嘗試從我們的南向 API 反序列化物件或物件串列的回應。現在,我嘗試使用此代碼決議一個物件或一個物件串列,只需洗掉兩者中的任何一個即可。所以我確定我下面的任何一個決議都有效,但是當我嘗試將兩個決議器合并為一個時,我得到一個錯誤
無法從 START_ARRAY 令牌反序列化物件實體
即使帶有物件的有效負載格式正確,下面的代碼也可以將單個物件轉換為物件串列,反之亦然。
下面是我擁有的代碼。
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
// @JsonInclude(JsonInclude.Include.NON_NULL)
public final class GetCreditCardInfo {
// Deserializer for List of Objects
@JsonAlias("ns:return")
private List<CreditCardDetails> details;
// Deserializer for an Object
@JsonAlias("ns:return")
private CreditCardDetails detailsObject;
public List<CreditCardDetails> getDetails() {
// List< CreditCardDetails > list = List.of( detailsObject ) ;
if(details == null) {
details = List.of(detailsObject);
} else {
}
return details;
}
}
上面的代碼所做的是我嘗試決議一個物件或一個物件串列。如果無法得到物件串列,則嘗試將物件決議為物件串列,否則將保留從南向API獲取的物件串列。
我該怎么做才能使這項作業如我所愿?謝謝
物件的示例 JSON 串列
{
"soapenv:Envelope":{
"soapenv:Body":{
"ns:getCreditCardResponse":{
"xmlns:ns":"",
"ns:return":[
{
"ax21:cif":"1"
},
{
"ax21:cif":"2"
}
],
"xmlns:ax21":"",
"xmlns:ax23":""
}
},
"xmlns:soapenv":"http://schemas.xmlsoap.org/soap/envelope/"
}
}
示例 JSON 物件:
{
"soapenv:Envelope":{
"soapenv:Body":{
"ns:getCreditCardResponse":{
"xmlns:ns":"",
"ns:return":{
"ax21:cif":"1"
},
"xmlns:cif":""
}
},
"xmlns:soapenv":"http://schemas.xmlsoap.org/soap/envelope/"
}
}
PS:
- 示例 JSON 物件可能已經被我在代碼中的兩個反序列化器反序列化了
- 我也嘗試用
@JsonInclude(JsonInclude.Include.NON_NULL)
忽略不存在的 json 欄位的反序列化錯誤,但問題仍然存在。
示例:物件反序列化器
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
public final class CreditCardDetails {
@JsonAlias("ax21:cif")
private String cif;
}
uj5u.com熱心網友回復:
你可以只添加@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)在你private List<CreditCardDetails> details;的GetCreditCardInfo班級。
這樣,如果ns:returnjson 中只有一個值(是一個物件),它將在 java 中反序列化為單元素 List。
因此,嘗試更改GetCreditCardInfo為以下內容:
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
// @JsonInclude(JsonInclude.Include.NON_NULL)
public final class GetCreditCardInfo {
@JsonAlias("ns:return")
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
private List<CreditCardDetails> details;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/348713.html
上一篇:FeignClient:使用jar運行(CompletableFuture.supplyAsynccallFeignClientthrowjava.lang.IllegalArgumentExcept
