C # 개체 오류에 대한 JSON 응답 역 직렬화

무 니르 메주 브

내가하는 일은 API를 호출하고 응답을 C # 개체로 바꾸는 것입니다. 내 작업 코드 https://codereview.stackexchange.com/questions/253949/api-response-json-to-c-object/ 를 리팩터링하려고합니다 . 이제 codereview에서 제안 된 코드에 다음 오류가 발생합니다.

Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'Candlestick' because the type requires a JSON object (e.g. {"name":"
value"}) to deserialize correctly.
To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be
 deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.

API의 Json 응답 :

[
    [
        1609065000000,
        "22739.71000000",
        "22795.73000000",
        "22700.39000000",
        "22779.08000000",
        "38.81782800",
        1609065899999,
        "883167.94526884",
        2261,
        "18.58965200",
        "423036.58181400",
        "0"
    ]
]

    [System.Text.Json.Serialization.JsonConverter(typeof(CandlestickConverter))]
    public class Candlestick
    {
        public long OpenTime { get; set; }
        public double Open { get; set; }
        public double High { get; set; }
        public double Low { get; set; }
        public double Close { get; set; }
        public double Volume { get; set; }
        public long CloseTime { get; set; }
        public double QuoteAssetVolume { get; set; }
        public long NumberOfTrades { get; set; }
        public double TakerBuyBaseAssetVolume { get; set; }
        public double TakerBuyQuoteAssetVolume { get; set; }
    }
   public class CandlestickConverter : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            var candle = (Candlestick) value;
            serializer.Serialize(writer ,
                new[]
                {
                    candle.OpenTime,
                    candle.Open,
                    candle.High,
                    candle.Low,
                    candle.Close,
                    candle.Volume,
                    candle.CloseTime,
                    candle.QuoteAssetVolume,
                    candle.NumberOfTrades,
                    candle.TakerBuyBaseAssetVolume,
                    candle.TakerBuyQuoteAssetVolume
                });
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null)
                return null;

            var candle = existingValue as Candlestick ?? new Candlestick();

            var array = JArray.Load(reader);
            
            candle.OpenTime = array.ElementAtOrDefault(0)?.ToObject<long>(serializer) ?? 0;
            candle.Open = array.ElementAtOrDefault(1)?.ToObject<double>(serializer) ?? 0;
            candle.High = array.ElementAtOrDefault(2)?.ToObject<double>(serializer) ?? 0;
            candle.Low = array.ElementAtOrDefault(3)?.ToObject<double>(serializer) ?? 0;
            candle.Close = array.ElementAtOrDefault(4)?.ToObject<double>(serializer) ?? 0;
            candle.Volume = array.ElementAtOrDefault(5)?.ToObject<double>(serializer) ?? 0;
            candle.CloseTime = array.ElementAtOrDefault(6)?.ToObject<long>(serializer) ?? 0;
            candle.QuoteAssetVolume = array.ElementAtOrDefault(7)?.ToObject<double>(serializer) ?? 0;
            candle.NumberOfTrades = array.ElementAtOrDefault(8)?.ToObject<long>(serializer) ?? 0;
            candle.TakerBuyBaseAssetVolume = array.ElementAtOrDefault(9)?.ToObject<double>(serializer) ?? 0;
            candle.TakerBuyQuoteAssetVolume = array.ElementAtOrDefault(10)?.ToObject<double>(serializer) ?? 0;

            return candle;
        }

        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(Candlestick);
        }
    }

전환의 구현 :

    var jsonObjectResponse = await response.Content.ReadAsStringAsync();
    var candles = JsonConvert.DeserializeObject<List<Candlestick>>(jsonObjectResponse);

나는 또한 시도했다 var candles = JsonConvert.DeserializeObject<List<Candlestick>>($"{{{jsonObjectResponse}}}");

이것은 다음 오류를 제공했습니다. Newtonsoft.Json.JsonReaderException: Invalid property identifier character: [. Path '', line 1, position 1.

json 응답 객체는 이전에 작업 한 적이없는 것입니다. 나는 그것을 작동했지만 더 깨끗한 코드를 원하며 내가 제공 한 링크에서 제안한대로 작동하도록 노력하고 있습니다. 누구든지 해결이 무엇인지 또는 더 많은 정보를 찾을 수있는 곳을 알고 있습니까?

무 니르 메주 브

@TomekSzpakowicz가 그의 의견에 답을주었습니다. 사용자 지정 변환기를 등록해야했기 때문에 시작 파일에 다음 코드를 추가했습니다.

            JsonConvert.DefaultSettings = () => new JsonSerializerSettings
            {
                Converters = new List<JsonConverter>
                {
                    new CandlestickConverter(),
                }
            };

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

JSON 역 직렬화 된 HTTP 응답 개체에 대한 ASP.NET 전달 변수

분류에서Dev

C #에서 JSON 개체 역 직렬화

분류에서Dev

C #에서 JSON 역 직렬화 : 개체 대 배열

분류에서Dev

Alexa Skill 요청 역 직렬화 실패-SkillRequest 개체에 대한 JSON C #

분류에서Dev

Azure JSON 응답 역 직렬화 C #

분류에서Dev

Json 응답 C # 역 직렬화

분류에서Dev

JSON 응답을 특정 클래스 개체로 역 직렬화

분류에서Dev

C # / JSON 개체 직렬화, 역 직렬화 및 대 / 소문자 문제 없음

분류에서Dev

NULL을 가져 오는 VB.NET 개체에 대한 JSON의 역 직렬화

분류에서Dev

JSON을 C # 개체로 역 직렬화

분류에서Dev

복잡한 JSON 개체 역 직렬화 C #

분류에서Dev

JSON 문자열에서 선택한 JSON 개체 역 직렬화

분류에서Dev

복잡한 JSON 개체 역 직렬화

분류에서Dev

JSON 응답이 C #에서 역 직렬화되지 않습니까?

분류에서Dev

C # Newtonsoft.json을 사용하여 단 하나의 속성 (루트를 찾을 수 없음)에 대한 Json 응답을 역 직렬화합니다.

분류에서Dev

Dictionary에서 상속 된 개체에 대한 C # 역 직렬화 예외

분류에서Dev

Java의 사용자 지정 열거 형 값에 대한 JSON 응답 역 직렬화

분류에서Dev

JSON 개체 역 직렬화

분류에서Dev

Java 직렬화 / 역 직렬화에 대한 안전한 json

분류에서Dev

C #의 IMGUR API에서 현재 JSON 개체 오류를 역 직렬화 할 수 없습니다.

분류에서Dev

C #에서는 간단한 JSON 개체를 정수 목록으로 역 직렬화합니다.

분류에서Dev

REST API의 HTTP 메서드에 대한 요청 및 응답에서 Json 직렬화 또는 역 직렬화를 적용하는 방법

분류에서Dev

파일에서 개체를 역 직렬화 및 재 직렬화하는 데 문제가있는 C # JSON.net

분류에서Dev

동적 JSON 응답 역 직렬화

분류에서Dev

echonest JSON 응답 역 직렬화

분류에서Dev

강력한 형식의 개체로 JSON 응답을 직접 역 직렬화 할 때 필드를 피하는 방법은 무엇입니까?

분류에서Dev

C #에서 Newtonsoft를 사용하여 중첩 된 JSON 개체의 역 직렬화

분류에서Dev

URL에서 C #의 List <T>로 여러 Json 개체 역 직렬화

분류에서Dev

C #에서 변경되는 JSON 개체 이름을 역 직렬화합니다.

Related 관련 기사

  1. 1

    JSON 역 직렬화 된 HTTP 응답 개체에 대한 ASP.NET 전달 변수

  2. 2

    C #에서 JSON 개체 역 직렬화

  3. 3

    C #에서 JSON 역 직렬화 : 개체 대 배열

  4. 4

    Alexa Skill 요청 역 직렬화 실패-SkillRequest 개체에 대한 JSON C #

  5. 5

    Azure JSON 응답 역 직렬화 C #

  6. 6

    Json 응답 C # 역 직렬화

  7. 7

    JSON 응답을 특정 클래스 개체로 역 직렬화

  8. 8

    C # / JSON 개체 직렬화, 역 직렬화 및 대 / 소문자 문제 없음

  9. 9

    NULL을 가져 오는 VB.NET 개체에 대한 JSON의 역 직렬화

  10. 10

    JSON을 C # 개체로 역 직렬화

  11. 11

    복잡한 JSON 개체 역 직렬화 C #

  12. 12

    JSON 문자열에서 선택한 JSON 개체 역 직렬화

  13. 13

    복잡한 JSON 개체 역 직렬화

  14. 14

    JSON 응답이 C #에서 역 직렬화되지 않습니까?

  15. 15

    C # Newtonsoft.json을 사용하여 단 하나의 속성 (루트를 찾을 수 없음)에 대한 Json 응답을 역 직렬화합니다.

  16. 16

    Dictionary에서 상속 된 개체에 대한 C # 역 직렬화 예외

  17. 17

    Java의 사용자 지정 열거 형 값에 대한 JSON 응답 역 직렬화

  18. 18

    JSON 개체 역 직렬화

  19. 19

    Java 직렬화 / 역 직렬화에 대한 안전한 json

  20. 20

    C #의 IMGUR API에서 현재 JSON 개체 오류를 역 직렬화 할 수 없습니다.

  21. 21

    C #에서는 간단한 JSON 개체를 정수 목록으로 역 직렬화합니다.

  22. 22

    REST API의 HTTP 메서드에 대한 요청 및 응답에서 Json 직렬화 또는 역 직렬화를 적용하는 방법

  23. 23

    파일에서 개체를 역 직렬화 및 재 직렬화하는 데 문제가있는 C # JSON.net

  24. 24

    동적 JSON 응답 역 직렬화

  25. 25

    echonest JSON 응답 역 직렬화

  26. 26

    강력한 형식의 개체로 JSON 응답을 직접 역 직렬화 할 때 필드를 피하는 방법은 무엇입니까?

  27. 27

    C #에서 Newtonsoft를 사용하여 중첩 된 JSON 개체의 역 직렬화

  28. 28

    URL에서 C #의 List <T>로 여러 Json 개체 역 직렬화

  29. 29

    C #에서 변경되는 JSON 개체 이름을 역 직렬화합니다.

뜨겁다태그

보관