잭슨 직렬화는 사용자 정의 시리얼없이 문자열 수 있습니까?

니코 :

난 내 코드에서 추가 사용에 대한 I는 POJO로가 나타난다 JSON 문자열을 직렬화 싶지만 사용자 지정 serializer를 작성하지 않고이 작업을 얻기 위해 고군분투하고있다.

나는 것이다 선호하는 솔루션으로 하지 않고 사용자 지정 serializer를 작성하지만이 유일한 방법 인 경우 내가 하나를 작성합니다.

또한 나는리스트 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()
  {
  }

}

주석을 추가 @JsonAnySetter 또는 내가 다시 제거하고 지금은 JSON의 올바른 직렬화를 가능하게 할 수 약간있는 트릭 궁금 있도록 @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=200630&siteId=1