簡體   English   中英

如果沒有自定義序列化器,這個字符串的Jackson序列化是否可行

[英]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 您可以使用keySetvalues方法將其轉換為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM