[英]Is Jackson Serialization of this string possible without custom serializer?
我想將我收到的JSON-String序列化為POJO,以便在我的代碼中進一步使用,但是我很難在不編寫自定義序列化程序的情況下使其工作。
我更喜歡在不編寫自定義序列化程序的情況下作為解決方案,但如果這是唯一可行的方法,我將編寫一個。
另外我相信我收到的數據是一個奇怪的JSON,因為我請求的列表不是使用[]
發送為列表而是使用{}
作為對象發送。
我收到以下列表/對象(縮寫):
{
"results": {
"ALL": {
"currencyName": "Albanian Lek",
"currencySymbol": "Lek",
"id": "ALL"
},
"XCD": {
"currencyName": "East Caribbean Dollar",
"currencySymbol": "$",
"id": "XCD"
},
"EUR": {
"currencyName": "Euro",
"currencySymbol": "â?¬",
"id": "EUR"
},
"BBD": {
"currencyName": "Barbadian Dollar",
"currencySymbol": "$",
"id": "BBD"
},
"BTN": {
"currencyName": "Bhutanese Ngultrum",
"id": "BTN"
},
"BND": {
"currencyName": "Brunei Dollar",
"currencySymbol": "$",
"id": "BND"
}
}
}
我為內部對象創建了我的第一個POJO,如下所示:
public class CurrencyDTO implements Serializable {
private String currencyName;
private String currencySymbol;
private String currencyId;
@JsonCreator
public CurrencyDTO( @JsonProperty( "currencyName" ) String currencyName, @JsonProperty( "currencySymbol" ) String currencySymbol,
@JsonProperty( "id" ) String currencyId )
{
this.currencyId = currencyId;
this.currencyName = currencyName;
this.currencySymbol = currencySymbol;
}
}
哪個好。 現在我寫了另一個POJO作為數據的包裝器,上面的層看起來像這樣:
public class CurrencyListDTO implements Serializable {
private List<Map<String, CurrencyDTO>> results;
public CurrencyListDTO()
{
}
}
添加注釋@JsonAnySetter或使用@JsonCreator也沒有幫助,所以我再次刪除它們,現在我想知道哪個小技巧可以啟用正確的json序列化。
我的例外情況如下:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token
at [Source: (String)"{"results":{"ALL":{"currencyName":"Albanian Lek","currencySymbol":"Lek","id":"ALL"},"XCD":{"currencyName":"East Caribbean Dollar","currencySymbol":"$","id":"XCD"},"EUR":{"currencyName":"Euro","currencySymbol":"â?¬","id":"EUR"},"BBD":{"currencyName":"Barbadian Dollar","currencySymbol":"$","id":"BBD"},"BTN":{"currencyName":"Bhutanese Ngultrum","id":"BTN"},"BND":{"currencyName":"Brunei Dollar","currencySymbol":"$","id":"BND"},"XAF":{"currencyName":"Central African CFA Franc","id":"XAF"},"CUP":{"cur"[truncated 10515 chars]; line: 1, column: 12] (through reference chain: com.nico.Banking.api.data.dto.CurrencyListDTO["results"])
您的CurrencyListDTO
應如下所示。 results
屬性是一個JSON Object
,應該直接映射到Map
。 您可以使用keySet
或values
方法將其轉換為Collection
。
class CurrencyListDTO implements Serializable {
private Map<String, CurrencyDTO> results;
public Map<String, CurrencyDTO> getResults() {
return results;
}
public void setResults(Map<String, CurrencyDTO> results) {
this.results = results;
}
@Override
public String toString() {
return "CurrencyListDTO{" +
"results=" + results +
'}';
}
}
您應該將CurrencyListDTO
更改為:
public class CurrencyListDTO {
private Map<String, CurrencyDTO> results;
// getters and setters
}
因為響應對象中的results
字段是另一個對象,其currencyId
為key而沒有數組。
然后,您可以創建這樣的貨幣列表:
ObjectMapper mapper = new ObjectMapper();
CurrencyListDTO result = mapper.readValue(json, CurrencyListDTO.class);
List<CurrencyDTO> currencies = new ArrayList<>(result.getResults().values());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.