Как десериализовать массив JSON из Web API в UPW C#? - PullRequest
1 голос
/ 22 апреля 2020

Я хочу подключиться к bitbay web api, получить оттуда данные JSON и сохранить их в файл. Мой JSON выглядит так:

{
  "status": "Ok",
  "items": [
    {
      "id": "737a2935-84c9-11ea-8cdc-0242ac11000e",
      "t": "1587581134890",
      "a": "0.00926098",
      "r": "29999",
      "ty": "Buy"
    },
    {
      "id": "6c4474fa-84c9-11ea-8cdc-0242ac11000e",
      "t": "1587581122794",
      "a": "0.02475367",
      "r": "29999",
      "ty": "Buy"
    }
  ]
}

Я хочу получить от него t, a, r и ty. У меня есть код:

public class TradeModel
    {
        public decimal R { get; set; }
        public decimal A { get; set; }
        public string Ty { get; set; }
        public DateTime T { get; set; }
    }

public class TradeItemModel
    {
        public TradeModel Items { get; set; }
    }

public class TradeProcessor
    {
        public static async Task<TradeModel> LoadTrades( int limit = 1 )
        {
            string url = "";

            if (limit <= 300)
            {
                url = $"https://api.bitbay.net/rest/trading/transactions/BTC-PLN?limit={ limit }";
            }
            else
            {

            }

            using (HttpResponseMessage response = await ApiHelper.ApiClient.GetAsync(url))
            {
                if (response.IsSuccessStatusCode)
                {
                    TradeItemModel trade = await response.Content.ReadAsAsync<TradeItemModel>();

                    return trade.Items;       
                }
                else
                {
                    throw new Exception(response.ReasonPhrase);
                }
            }
        }
    }

После запуска этого кода я получаю исключение: не могу десериализовать текущий массив JSON (например, [1,2,3]) в тип 'DemoLibrary .TradeModel ', поскольку для корректной десериализации для типа требуется объект JSON (например, {"name": "value"}). Чтобы исправить эту ошибку, либо замените JSON на JSON объект (например, {"name": "value"}), либо измените десериализованный тип на массив или тип, который реализует интерфейс коллекции (например, ICollection, IList) как List, который можно десериализовать из массива JSON. JsonArrayAttribute также можно добавить к типу, чтобы заставить его десериализоваться из массива JSON. Путь «элементы», строка 1, позиция 24 ».

1 Ответ

1 голос
/ 22 апреля 2020

Класс Item в TradeItemModel должен быть коллекцией TradeModel[] или List<TradeModel>, и вы также можете добавить Status, чтобы проверить, в порядке ли или KO:

public class TradeItemModel
{
    public string Status { get; set; }
    public List<TradeModel> Items { get; set; }
}

Вы также должны изменить сигнатуру метода на:

public static async Task<List<TradeModel>> LoadTrades( int limit = 1 )

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...