Получить расширение JSON API с несколькими типами данных в списке - PullRequest
0 голосов
/ 29 мая 2018

Я сейчас работаю в проекте uwp, который получает значения из JSON Web API.Внутри API у меня есть несколько комнат и атрибутов к ним, и у меня нет проблем с их достижением.

Проблема, с которой я столкнулся, заключается в том, как мне получить значения для всех бронирований в комнатах, чтобы их бронировали.в расширении URL, например:

URL-адрес без бронирования:

string url = "https://api.booking.com/api/room";

URL-адрес с бронированиями:

string url = "https://api.booking.com/api/room/35bf3c4d-9b5b-40fd-bcf4-a4c2c6c564bc/bookings";

Guid - это идентификатор комнаты.

Та же проблема, что у меня была с изображениями каждой комнаты, но я решил эту проблему, выполнив следующее:

Это то, что я сначала протестировал, но затем я получил только одно изображение:

string url = "https://api.booking.com/api/room/35bf3c4d-9b5b-40fd-bcf4-a4c2c6c564bc/image";

Но я проверил это, и он получил все изображения:

public Uri ImageUrl => 
   new Uri( $"https://api.booking.com/api/room/{Id}/image", UriKind.Absolute );

Итак, я получил идентификатор каждой комнаты и получил изображение для всех комнат, но этот метод нене работает с бронированиями, потому что в расширении бронирования есть несколько типов данных, и он не работает, если я сделаю объект uri.

Надеюсь, что вы понимаете мою проблему ...

Заранее спасибо!

РЕДАКТИРОВАТЬ:

JSON образец из двухиз номеров:

[
{
    "name": "Rum 1",
    "id": "a31d1fc8-df29-419c-8308-f8bc884b378e",
    "seats": 10,
    "availableFrom": null,
    "availableTo": null
  },
  {
    "name": "Rum 2",
    "id": "7defd34d-222d-4980-b28f-e616e8b9003c",
    "seats": 5,
    "availableFrom": null,
    "availableTo": null
  }
]

Json образец одной из бронирований:

[
  {
    "id": "12324a01-92b7-49f3-8d10-1def59eddd32",
    "code": 6679,
    "timeFrom": "2018-02-13T16:00:00",
    "timeTo": "2018-02-13T16:45:00",
    "note": null,
    "createdDate": "2018-02-13T10:04:14.8",
    "room": {
      "name": "Rum 2",
      "id": "7defd34d-222d-4980-b28f-e616e8b9003c",
      "seats": 10,
      "availableFrom": null,
      "availableTo": null
    }
  }
]

Это мой класс для бронирований:

public class Bookings
{
    public string id { get; set; }
    public int code { get; set; }
    public DateTime timeFrom { get; set; }
    public DateTime timeTo { get; set; }
    public List<Class2> room { get; set; }
}

И этокласс для комнат:

public class Class2
{
    public string name { get; set; }
    public string id { get; set; }
    public int seats { get; set; }
    public Uri ImageUrl => new Uri($"https://api.bookings.com/api/rooms/{id}/image", UriKind.Absolute);
}

Вот как я получаю заказы:

string booking = "https://api.booking.com/api/room/{id}/bookings";

HttpClient BookingClient = new HttpClient();

string BookingResponse = await BookingClient.GetStringAsync(booking);

var BookingData = JsonConvert.DeserializeObject<List<Bookings>>(response);

Здесь я объявляю переменную комнату и книги:

foreach (var room in data)
{
    string id = room.id;
    string name = room.name;
    int seats = room.seats;
    Uri Img = room.ImageUrl;

    foreach (var books in BookingData)
    {
        string note = books.note;
        DateTime TimeFrom = books.timeFrom;
        DateTime TimeTo = books.timeTo;
        Class2 BookRoom = books.room;
        string BookId = books.id;
        int code = books.code;

        //if (room.Bookings.Any(a => a.timeFrom == DateTime.UtcNow))
        //{
        //    templategrid.GreenToRed();
        //}
        //else if (room.Bookings.Any(a => a.timeFrom != DateTime.UtcNow))
        //{
        //    do stuff
        //}
    }
}

1 Ответ

0 голосов
/ 29 мая 2018

Возможно, проблема в классе Bookings:

public class Bookings
{
    public string id { get; set; }
    public int code { get; set; }
    public DateTime timeFrom { get; set; }
    public DateTime timeTo { get; set; }
    public Class2 room { get; set; }
}

Свойство room не является List или массивом в соответствии с приведенным вами примером JSON - это всего лишь одинномер.Я также рекомендую вам изменить имя класса Class2 на что-то вроде BookingRoom, чтобы сделать код более читабельным.

Чтобы прочитать данные с конечной точки bookings, вы можете выполнить

var bookings = JsonConvert.DeserializeObject<Bookings[]>( jsonString );

Обновление : Я только что протестировал десериализацию класса так же, как вы, и он отлично десериализует даты:

Deserializing

Я использовал точно такие же классы:

public class Bookings
{
    public string id { get; set; }
    public int code { get; set; }
    public DateTime timeFrom { get; set; }
    public DateTime timeTo { get; set; }
    public Class2 room { get; set; }
}

public class Class2
{
    public string name { get; set; }
    public string id { get; set; }
    public int seats { get; set; }
    public Uri ImageUrl => new Uri($"https://api.rumsbokning.nu/api/companies/aab96aa1-d8ca-4f74-8e35-ded190c38dd4/rooms/{id}/image", UriKind.Absolute);
}

Обновление : Вы должны зарезервировать залы для комнат и связать их вручную:

foreach (var room in data)
{
   string booking = $"https://api.booking.com/api/room/{room.Id}/bookings";
   HttpClient BookingClient = new HttpClient();
   string BookingResponse = await BookingClient.GetStringAsync(booking);
   var bookings = JsonConvert.DeserializeObject<List<Bookings>>(response);
   room.Bookings = bookings;
}

То, что в настоящее время делает ваш код, перечисляет каждую комнату и для каждой комнаты перечисляет одну и ту же BookingsData переменную , которая не работает, потому что переменная содержит бронирования только для одной из комнат,не для всех.

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