Десериализация различных возможных объектов с использованием одного и того же класса

2

Я столкнулся с проблемой при попытке десериализации JSON с помощью С#.

У меня есть класс pagingObject, который имеет массив объектов items. Этот массив может быть несколькими различными объектами, каждый из которых имеет разные структуры.

class pagingObject
{
    public string href { get; set; }
    public savedTrack[] items { get; set; } //this could be either savedTracks object or Tracks object, depending on request
    public int limit { get; set; }
    public string next { get; set; }
    public int offset { get; set; }
    public string previous { get; set; }
    public int total { get; set; }
}

class savedTrack
{
    public string added_at { get; set; }
    public Track track { get; set; }
}

class Track
{
    public Album album { get; set; }
    public Artist[] artists { get; set; }
    public string[] available_markets { get; set; }
    public int disc_number { get; set; }
    public int duration_ms { get; set; }

    [JsonProperty(PropertyName = "explicit")]
    public bool is_explicit { get; set; }
    public External_ids external_id { get; set; }
    public string href { get; set; }
    public string id { get; set; }
    public string name { get; set; }
    public int popularity { get; set; }
    public string preview_url { get; set; }
    public int track_number { get; set; }
    public string type { get; set; }
    public string uri { get; set; }
}

Я использую Newtonsoft.Json для десериализации.

Как я могу сообщить своей программе, что элементы могут быть одним из указанных объектов (сохраненные треки или треки)?

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

  • 1
    позволяя обоим классам реализовать общий базовый класс и десериализовать список этого типа.
  • 0
    но как мне объявить это в pagingObjects? в строке с комментарием?
Показать ещё 3 комментария
Теги:
deserialization

2 ответа

1
Лучший ответ

Кажется, что вы можете просто использовать универсальный pagingObject<T> в качестве базовой модели:

class pagingObject<T>
{
    public string href { get; set; }
    public T[] items { get; set; }
    public int limit { get; set; }
    public string next { get; set; }
    public int offset { get; set; }
    public string previous { get; set; }
    public int total { get; set; }
}

И позже вы можете десериализовать JSON, указав конкретный тип, например:

pagingObject<Truck> model = JsonConvert.DeserializeObject<pagingObject<Truck>>(jsonStr);
pagingObject<savedTrack> model = JsonConvert.DeserializeObject<pagingObject<savedTrack>>(jsonStr);
0

Пересмотр майора, я не думал прямо.

Я полагаю, что вы можете изменить общедоступные элементы saveTrack [] на:

public object[] items

затем после того, как вы можете проверить, соответствует ли массив элементов одному из ожидаемых типов объектов

  • 0
    Это решение вызывает исключение System.InvalidCastException.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню