json 배열과 일반 속성을 jackson의 pojo로 역 직렬화하는 방법. 어레이 만 작동

요헨 부흐 홀츠

어려움은 json 레이블이 Kraken api의 나머지 응답에서 부분적으로 동적이라는 것입니다. 처음에는 작업 사례를 소개합니다. Kraken 거래 API를 연결하여 통화를 자산으로 가져오고 json에서 다음 결과를 얻었습니다.

{
    "error": [],
    "result": {
        "AAVE": {
            "aclass": "currency",
            "altname": "AAVE",
            "decimals": 10,
            "display_decimals": 5
        },
        "ZUSD": {
            "aclass": "currency",
            "altname": "USD",
            "decimals": 4,
            "display_decimals": 2
        }
    }
}

이 예에서 AAVA 및 ZUSD는 동적 레이블입니다. 임베디드 Jackson을 사용하여 OpenFeign 프레임 워크에서 구문 분석합니다. 결과 부분은 다음과 같은 일반 클래스로 처리됩니다.

public class Response<T> {
    
    private List<String> error = new ArrayList<>();
    private T result;
    
    // getter and setters
}

자산의 루트 클래스로서 동적 레이블 AAVA 및 ZUSD는 맵에서 처리합니다.

public class AssetInfoResponse extends 
              Response<Map<String, AssetInfo>> {
}

pojo AssetInfo :

public class AssetInfo implements Serializable{

    @JsonProperty("altname")
    private String alternateName;

    @JsonProperty("aclass")
    private String assetClass;

    @JsonProperty("decimals")
    private Byte decimals;

    @JsonProperty("display_decimals")
    private Byte displayDecimals;

    // getters, setters ...
}

위의 경우는 완벽하게 작동하며 동적 레이블이있는 솔루션도 마찬가지입니다.

다음은 ohlc 데이터에 대한 응답입니다. 비슷해 보이며 다음 경우에 deserialization 문제를 해결할 아이디어가 없습니다.

{
    "error": [],
    "result": {
        "XXBTZEUR": [
            [
                1613212500,
                "39000.1",
                "39010.1",
                "38972.3",
                "38994.1",
                "38998.1",
                "3.23811638",
                70
            ],
            [
                1613212560,
                "38994.3",
                "39014.5",
                "38994.3",
                "39014.5",
                "38997.3",
                "0.95105956",
                11
            ]
        ],
        "last": 1613212500
    }
}

문제의 원인은 "last": 1613212500대지 경계선입니다. 이 줄을 제거하면 응답이 문제없이 구문 분석 될 수 있습니다. 나는 다음 클래스로 그것을 해결하려고 노력하고 Response있습니다.

public class OhlcLastResponse<T> extends Response<T> {

    private Long last;
   
    // getters and setters

}

다음 클래스는 prevourious 클래스를 확장하며 objectmapper의 루트 클래스입니다.

public class OhlcResponse
      extends OhlcLastResponse<Map<String, List<Candelstick>>> {
}

그리고 캔들 스틱 데이터를 보유하는 포조 :

@JsonFormat(shape = JsonFormat.Shape.ARRAY)
@JsonPropertyOrder({ "time", "open", "high", "low",
                     "close", "vwap", "volume", "count" })
public class Candelstick implements Serializable {
    
    private Integer time;

    private BigDecimal open;

    private BigDecimal high;

    private BigDecimal low;

    private BigDecimal close;

    private BigDecimal vwap;

    private BigDecimal volume;

    private Integer count;

    // getters and setters ...
}

그리고 여기에 오류가 있습니다.

                "38997.3",
                "0.95105956",
                11
            ]
        ],
        "last": 1613212500
    }
}
"; line: 26, column: 11] (through reference chain: OhlcResponse["result"]->java.util.LinkedHashMap["last"])
    at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)

Jackson은이 last부동산을지도 에 넣으려고 하지만지도는 ],. 26 행 last은 json 파일 레이블 이있는 행입니다 .

이 json을 구문 분석 할 가능성이 있습니까? 배열이 대괄호로 닫혀 있기 때문에 가능해야한다고 생각합니다.

나머지 클라이언트를 github 에서 호스팅했습니다 . 오류를 재현하려면 복제하고 mvn test.

요헨 부흐 홀츠

이 경우 형식 처리가 매우 어렵 기 때문에 솔루션은 deserializer입니다. deserializer는 배열 또는 단일 마지막 값의 두 경우 중에서 결정하고 배열의 경우 CandleStickClass에 대한 deserializer를 호출합니다 .

public class OhlcDeserializer extends JsonDeserializer<OhclPayload> {

    @Override
    public OhclPayload deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {

        List<CandleStick> candleSticks = new ArrayList<CandleStick>();

        Long last = null;

        ObjectCodec objectCodec = p.getCodec();
        JsonNode jsonNode = objectCodec.readTree(p);

        Iterator<Entry<String, JsonNode>> payloadIterator = jsonNode.fields();
        while (payloadIterator.hasNext()) {
            Map.Entry<String, JsonNode> entry = payloadIterator.next();
            if (entry.getKey().equals("last")) {
                last = entry.getValue().asLong();
            } else if (entry.getValue().isArray()) {
                for (JsonNode node : entry.getValue()) {
                    CandleStick cs = p.getCodec().treeToValue(node, CandleStick.class);
                    candleSticks.add(cs);
                }
            }
        }

        return new OhclPayload(candleSticks, last);
    }

}

OhclResponse를 다음과 같이 변경했습니다.

public class OhlcResponse extends Response<OhclPayload> {
}

그리고 deserializer에 대한 OhlcPayload 클래스를 삽입합니다.

@JsonDeserialize(using = OhlcDeserializer.class)
public class OhclPayload {

    private List<CandleStick> candleSticks;

    private Long last;
    // getters and setters
}

그게 다야.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

변수 이름과 배열로 JSON을 역 직렬화하는 방법

분류에서Dev

Jackson을 사용하여 JSON 배열을 단일 연결 목록으로 역 직렬화하는 방법

분류에서Dev

Jackson : 속기 속성 값으로 json을 역 직렬화하는 방법

분류에서Dev

Json.Net을 사용하여 숫자의 속성 이름으로 시작하는 json을 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

단일 속성 이름과 값을 각각 가진 개체 배열을 포함하는 JSON을 ac # 모델로 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

단일 속성 이름과 값을 각각 가진 개체 배열을 포함하는 JSON을 ac # 모델로 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

Finatra FeatureTests : 반환 된 json을 수동으로 역 직렬화하는 방법

분류에서Dev

Play의 json을 사용하여 동적 필드 이름을 직렬화 / 역 직렬화하는 방법

분류에서Dev

enum을 전역 적으로 문자열로 직렬화하는 방법 (각 enum의 속성이 아니라)?

분류에서Dev

Json 배열을 나열 (또는) 배열로 역 직렬화하는 방법

분류에서Dev

C #에서 테이블과 값으로 JSON을 역 직렬화하는 방법

분류에서Dev

C #으로 JSON 파일을 역 직렬화하는 방법

분류에서Dev

JsonPath / Jackson : JSON 배열을 단일 객체 ( "[1,2,3]"-> Vector3d 인스턴스)로 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

문자열 값이 동일한 이름의 개체에 래핑 된 JSON을 명확하게 역 직렬화하는 방법

분류에서Dev

JSON 문자열을 객체로 역 직렬화하는 방법

분류에서Dev

Json 파일의 일부만 클래스 C #으로 역 직렬화하는 방법

분류에서Dev

복잡한 json 파일을 POJO로 역 직렬화-하나의 목록 요소로 작동하거나 작동하지 않습니다.

분류에서Dev

다양한 데이터 유형을 포함하는 JSON 배열을 단일 객체로 역 직렬화하는 방법

분류에서Dev

JSON 데이터를 모델 객체의 배열로 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

Json.Net을 사용하여 Null 대신 F # 레코드의 빈 목록으로 누락 된 속성을 역 직렬화하는 방법

분류에서Dev

Jackson은 json 문자열을 역 직렬화하지만 bean에는 json 문자열의 속성 / 키가 없습니다.

분류에서Dev

JSON.NET : 부모 (홀더) 개체 값을 기반으로 인터페이스 속성을 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

비표준 (및 다양한) 속성 이름 (.NET)으로 JSON을 역 직렬화하는 방법

분류에서Dev

C #에서 역 직렬화하는 동안 JSON 문자열에없는 속성의 초기화를 방지하는 방법은 무엇입니까?

분류에서Dev

C #에서 JSON 배열을 역 직렬화하는 방법

분류에서Dev

ContractResolver ResolvePropertyName으로 작성된 속성을 역 직렬화하는 방법

분류에서Dev

@@를 포함하는 json 문자열을 scala로 역 직렬화하는 방법 '

분류에서Dev

클래스 이름을 동적 값으로 사용하여 json을 역 직렬화하는 방법

분류에서Dev

C # 중첩 된 JSON의 일부를 개체 속성에 저장하지만 역 직렬화하지 않는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    변수 이름과 배열로 JSON을 역 직렬화하는 방법

  2. 2

    Jackson을 사용하여 JSON 배열을 단일 연결 목록으로 역 직렬화하는 방법

  3. 3

    Jackson : 속기 속성 값으로 json을 역 직렬화하는 방법

  4. 4

    Json.Net을 사용하여 숫자의 속성 이름으로 시작하는 json을 역 직렬화하는 방법은 무엇입니까?

  5. 5

    단일 속성 이름과 값을 각각 가진 개체 배열을 포함하는 JSON을 ac # 모델로 역 직렬화하는 방법은 무엇입니까?

  6. 6

    단일 속성 이름과 값을 각각 가진 개체 배열을 포함하는 JSON을 ac # 모델로 역 직렬화하는 방법은 무엇입니까?

  7. 7

    Finatra FeatureTests : 반환 된 json을 수동으로 역 직렬화하는 방법

  8. 8

    Play의 json을 사용하여 동적 필드 이름을 직렬화 / 역 직렬화하는 방법

  9. 9

    enum을 전역 적으로 문자열로 직렬화하는 방법 (각 enum의 속성이 아니라)?

  10. 10

    Json 배열을 나열 (또는) 배열로 역 직렬화하는 방법

  11. 11

    C #에서 테이블과 값으로 JSON을 역 직렬화하는 방법

  12. 12

    C #으로 JSON 파일을 역 직렬화하는 방법

  13. 13

    JsonPath / Jackson : JSON 배열을 단일 객체 ( "[1,2,3]"-> Vector3d 인스턴스)로 역 직렬화하는 방법은 무엇입니까?

  14. 14

    문자열 값이 동일한 이름의 개체에 래핑 된 JSON을 명확하게 역 직렬화하는 방법

  15. 15

    JSON 문자열을 객체로 역 직렬화하는 방법

  16. 16

    Json 파일의 일부만 클래스 C #으로 역 직렬화하는 방법

  17. 17

    복잡한 json 파일을 POJO로 역 직렬화-하나의 목록 요소로 작동하거나 작동하지 않습니다.

  18. 18

    다양한 데이터 유형을 포함하는 JSON 배열을 단일 객체로 역 직렬화하는 방법

  19. 19

    JSON 데이터를 모델 객체의 배열로 역 직렬화하는 방법은 무엇입니까?

  20. 20

    Json.Net을 사용하여 Null 대신 F # 레코드의 빈 목록으로 누락 된 속성을 역 직렬화하는 방법

  21. 21

    Jackson은 json 문자열을 역 직렬화하지만 bean에는 json 문자열의 속성 / 키가 없습니다.

  22. 22

    JSON.NET : 부모 (홀더) 개체 값을 기반으로 인터페이스 속성을 역 직렬화하는 방법은 무엇입니까?

  23. 23

    비표준 (및 다양한) 속성 이름 (.NET)으로 JSON을 역 직렬화하는 방법

  24. 24

    C #에서 역 직렬화하는 동안 JSON 문자열에없는 속성의 초기화를 방지하는 방법은 무엇입니까?

  25. 25

    C #에서 JSON 배열을 역 직렬화하는 방법

  26. 26

    ContractResolver ResolvePropertyName으로 작성된 속성을 역 직렬화하는 방법

  27. 27

    @@를 포함하는 json 문자열을 scala로 역 직렬화하는 방법 '

  28. 28

    클래스 이름을 동적 값으로 사용하여 json을 역 직렬화하는 방법

  29. 29

    C # 중첩 된 JSON의 일부를 개체 속성에 저장하지만 역 직렬화하지 않는 방법은 무엇입니까?

뜨겁다태그

보관