2013-08-14 1 views
3

У меня есть API, с которого я получаю данные. Этот API не в моих силах контролировать, как он структурирован, и мне нужно сериализовать и десериализовать вывод JSON для сопоставления данных с моей моделью.Сериализация десериализации анонимных дочерних свойств JSON для модели

Все работает хорошо, где JSON красиво отформатирован с именованными свойствами.

Что вы можете делать там, где нет именованного значения, и существует только массив из целых чисел и строк? как под местах

здесь образец 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; } 
} 

и я отображающие с помощью встроенного АЯКС сериализации:

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); 

Таким образом, идентификатор и все другие свойства являются pi склеивается и отображается, но то, что я делаю, я не могу отобразить на карте.

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

+2

Не следует поле в вашем классе 'ItemResults' быть сбор и назван во множественном числе? например 'public IEnumerable Местоположение {get; задавать; } ' –

+4

Как и многие вопросы JSON, связанные с' JavaScriptSerializer', первая часть любого ответа обычно должна быть «прекратить использование JavaScriptSerializer»; извините, но для чего-то даже отдаленно нетривиального, Json.NET делает * намного лучше работу –

+1

Убрал мой ответ, так как формат не получился хорошо, но это полезный сайт для просмотра структуры ваших классов: http : //json2csharp.com/ – stevepkr84

ответ

2
public Dictionary<int,string> Locations { get; set; } 

работу; вы должны найти, что использование Json.NET, по крайней мере, то есть

var result = JsonConvert.DeserializeObject<ItemResults>(json); 

вы получаете 2 записи в result.Locations; в частности, result[103] = "Cambridge"; и result[107] = "London";

+0

Удивительное простое решение моей проблемы, большое спасибо за все ваши ответы. – Fuzzybear

2

Если вы не возражаете, вы можете обойти со словарем:

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 (Newtonsoft.Json) - Two 'properties' with same name?

1

Это будет работать:

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 }); } } 
1

Я предлагаю вам следующее решение:

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);

+0

По сравнению с использованием словаря ', который делает все по-другому, просто немного ...? –

+1

Если местоположение является juste id со значением, так что да, это сложно. Но если у вас больше свойств (геолокация, полный адрес и т. Д.), Этот способ может помочь :) –

Смежные вопросы