Сериализация десериализация анонимных дочерних свойств 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 и все другие свойства подобраны и сопоставлены, но то, что каждый я делаю, я не могу, кажется, сопоставить местоположения.



Большое спасибо

564   4  

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

    Ничего не найдено.