Сериализация десериализация анонимных дочерних свойств JSON в модель
У меня есть API, от которого я получаю данные. Этот API не зависит от того, как он структурирован, и мне нужно сериализовать и десериализовать выходные данные JSON, чтобы сопоставить данные с моей моделью.
Все хорошо работает там, где JSON хорошо отформатирован с именованными свойствами.
Что можно сделать там, где нет именованного значения, а есть только массив ints и строк? например, под локациями
Вот пример JSON:
{"id":"2160336","activation_date":"2013-08-01","expiration_date":"2013-08-29","title":"Practice Manager","locations":{"103":"Cambridge","107":"London"}}
У меня есть модели, которые например:
public class ItemResults
{
public int Id { get; set; }
public DateTime Activation_Date { get; set; }
public DateTime Expiration_Date{ get; set; }
public string Title { get; set; }
public Location Locations { get; set; }
}
public class Location
{
public int Id { get; set; }
public string value { get; set; }
}
И я сопоставляю с помощью встроенной AJAX-сериализации:
protected T MapRawApiResponseTo<T>( string response )
{
if ( string.IsNullOrEmpty( response ) )
{
return default( T );
}
var serialize = new JavaScriptSerializer();
return serialize.Deserialize<T>( response );
}
var results = MapRawApiResponseTo<ItemResults>(rawApiResponse);
Таким образом, ID и все другие свойства подобраны и сопоставлены, но то, что каждый я делаю, я не могу, кажется, сопоставить местоположения.
Большое спасибо
4 ответов:
public Dictionary<int,string> Locations { get; set; }Работа сделана; вы должны найти, что использование Json.NET, по крайней мере, т. е.
var result = JsonConvert.DeserializeObject<ItemResults>(json);Вы получаете 2 записи в
result.Locations; в частностиresult[103] = "Cambridge";иresult[107] = "London";
Если вы не возражаете, вы можете обойти с помощью словаря:
class Program { static void Main(string[] args) { string json = "{'id':'2160336','activation_date':'2013-08-01','expiration_date':'2013-08-29','title':'Practice Manager','locations':{'103':'Cambridge','107':'London'}}"; var deserializeObject = JsonConvert.DeserializeObject<ItemResults>(json); Console.WriteLine("{0}:{1}", deserializeObject.Locations.First().Key, deserializeObject.Locations.First().Value); Console.ReadKey(); } } public class ItemResults { public int Id { get; set; } public DateTime Activation_Date { get; set; } public DateTime Expiration_Date { get; set; } public string Title { get; set; } public Dictionary<int, string> Locations { get; set; } }Вы также можете использовать ручной синтаксический анализ, как здесь: Json.NET (Ньютонсофт.Json) - два "свойства" с одинаковым именем?
Это будет работать:
public Dictionary<string, string> Locations { get; set; } public IEnumerable<Location> LocationObjects { get { return Locations .Select(x => new Location { Id = int.Parse(x.Key), value = x.Value }); } }
Я предлагаю вам следующее решение :
public class ItemResults { public int Id { get; set; } public DateTime Activation_Date { get; set; } public DateTime Expiration_Date { get; set; } public string Title { get; set; } [JsonProperty("locations")] public JObject JsonLocations { get; set; } [JsonIgnore] public List<Location> Locations { get; set; } [OnDeserialized] public void OnDeserializedMethod(StreamingContext context) { this.Locations = new List<Location>(); foreach (KeyValuePair<string, JToken> item in this.JsonLocations) { this.Locations.Add(new Location() { Id = int.Parse(item.Key), value = item.Value.ToString() }); } } } public class Location { public int Id { get; set; } public string value { get; set; } }После того, как вы просто должны десериализовать свой JSON с помощью:
JsonConvert.DeserializeObject<ItemResults>(json);
Comments