ジャクソンシリアライゼーションは、カスタム・シリアライザせずにこの文字列のことは可能ですか?

ニコ:

私は私のコードでは、他の用途のために私は、POJOとして受け取るJSON-文字列をシリアル化したいが、私は、カスタム・シリアライザを記述することなく、それが働いてもらうのに苦労しています。

私は考え好むソリューションとしてせずにカスタム・シリアライザを書き、それが唯一の可能な方法であれば、私は1を書きます。

さらに私は、リストI要求を使用してリストとして送信されませんので、私は受信データが変な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()
  {
  }

}

私はそれらを再度取り出して、今私は少しトリックがJSONの正しいシリアル化を可能にする可能性が疑問に思って@JsonAnySetter注釈を追加または@JsonCreatorを使用すると、いずれかの助けにはなりませんでした。

私の例外は以下の通りであります:

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には:

public class CurrencyListDTO {
    private Map<String, CurrencyDTO> results;
    // getters and setters
}

なぜならresults応答オブジェクト内のフィールドを持つ別の目的であるcurrencyIdようなキーなしアレイ。

あなたは、このような通貨のリストを作成できます。

ObjectMapper mapper = new ObjectMapper();
CurrencyListDTO result = mapper.readValue(json, CurrencyListDTO.class);
List<CurrencyDTO> currencies = new ArrayList<>(result.getResults().values());

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=200632&siteId=1