Я столкнулся с проблемой при попытке десериализации 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 для десериализации.
Как я могу сообщить своей программе, что элементы могут быть одним из указанных объектов (сохраненные треки или треки)?
Заранее спасибо!
Кажется, что вы можете просто использовать универсальный 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);
Пересмотр майора, я не думал прямо.
Я полагаю, что вы можете изменить общедоступные элементы saveTrack [] на:
public object[] items
затем после того, как вы можете проверить, соответствует ли массив элементов одному из ожидаемых типов объектов