Xamarin C # restsharp разбор вложенного ответа JSON - PullRequest
0 голосов
/ 20 июня 2019

У меня возникли проблемы с анализом вложенного ответа JSON от API.

API возвращает массив с массивом объектов.Проблема, с которой я сталкиваюсь, заключается в значении int, содержащемся в каждом массиве перед объектами в массиве (см. Прикрепленный пример фрагмента JSON).

В настоящее время я настроил десериализованные типы и объекты, что, по-видимому, нормальноОднако проблема возникает, когда Restsharp не удается десериализовать значения INT для моего десериализованного типа.

Json

    [
         [
            1064,
            {
                "trx_id": "",
                "block": 0,
                "trx_in_block": 0,
                "op_in_trx": 0,
                "virtual_op": 0,
                "timestamp": "",
                "op": [
                    "vote",
                    {
                        "voter": "user1",
                        "author": "user2",
                        "permlink": "UUID",
                        "weight": 0
                    }
                ]
            }
        ]
    ]

Запрос

var response = await restClient.Execute<List<List<Models.Responses.AccountHistory.Transaction>>>(request);

Transaction.CS

    public class Transaction
        {
            public string trx_id { get; set; }
            public long block { get; set; }
            public long trx_in_block { get; set; }
            public long op_in_trx { get; set; }
            public long virtual_op { get; set; }
            //Etc..
    }

Я пытаюсь получить вложенный массивтранзакции десериализованы, значение int не является чем-то, для чего у меня есть практическое применение.Я ищу способ игнорировать целое число и только анализировать объекты.

Ошибка

Необработанное исключение: Newtonsoft.Json.JsonSerializationException: Ошибка преобразования значения 0 в тип 'Модели.Responses.AccountHistory.Transaction.Путь '[0] [0]', строка 1, позиция 3. произошло

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Вы можете написать свой собственный пользовательский десериализатор для клиента RestSharp.

Затем его необходимо будет установить на клиенте при его создании.

0 голосов
/ 22 июня 2019

Спасибо за указатель на пользовательские десериализаторы, это было полезно. Ниже приведен фрагмент решения:

[JsonConverter(typeof(HistoryDeserializer))]
    public class AccountHistory
    {
        public long Integer { get; set; }
        public Transaction transaction { get; set; }
    }

Пользовательский JsonConverter

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            switch (reader.TokenType)
            {
                case JsonToken.StartObject:
                    var objectValue = serializer.Deserialize<Transaction>(reader);
                    return new AccountHistory { transaction = objectValue };
                case JsonToken.Integer:
                    var integerValue = serializer.Deserialize<long>(reader);
                    return new AccountHistory { Integer = integerValue };
            }
            return null;
        }
...