2016-04-13 3 views
0

мне нужно имя свойства объекта объектами в:Как разобрать объект JSON с другим объектом Childen с C#

вот мой код:

JSON Пример:

{ 
"dados":  [{"codigo_localidade":"1", 
"localidade":"Adamantina", 
"nome_localidade_pai":"Regi\u00e3o de Governo de Adamantina", 
"codigo_variavel":"2", 
"variavel":"Cr\u00e9dito Rural Agricultura", 
"unidade":"(Em reais de 2015)", 
"periodo":"1985\/1989-2011", 
"ano":{"2010":"194.140.750"} 
} 

Мой C# КОД разобрать мой JSON:

Это метод, чтобы получить объект

private static IEnumerable<JToken> AllChildren(JToken json) 
     { 
      foreach (var c in json.Children()) 
      { 
       yield return c; 
       foreach (var cc in AllChildren(c)) 
       { 
        yield return cc; 
       } 
      } 
     } 

В случае необходимости, вот моя модель класса:

public class Cidade 
     { 
      public string localidade { get; set; } 
      public string populacao { get; set; } 
      public string nome_localidad_pai { get; set; } 
      public string ano { get; set; } 

     } 

Если кто-то может помочь я был бы очень благодарен.

(Извините о мой английский.)

+1

Непонятный пользователь Json http://jsonlint.com/ – Thomas

+0

Каков тип cidadesSON? – muneeb

+0

Непонятно, чего вы хотите. Вы можете отправить свой вопрос по адресу http://pt.stackoverflow.com/, который является португальской версией StackOverflow. (Я знаю это, потому что я говорю по-португальски, и вижу ваши переменные :) или попытаюсь объяснить лучше. – jpgrassi

ответ

0

TL; DR

Проблема с вашим кодом заключается в том, что мы не знаем, каков тип свойства ano. Вы можете сопоставить это свойство с Dictionary<string,object> и получить фактическое ano, обратившись к свойству Key словаря. Ниже пример того, как вы можете сделать это:

Предполагая, что вы можете использовать 3-библиотеки в вашей программе, вы можете в значительной степени сократить весь код на это, добавив Json.Net в свой проект:

" Dado»класс

public class Dado 
{ 
    public string localidade { get; set; } 
    public string populacao { get; set; } 
    public string nome_localidad_pai { get; set; } 

    [JsonConverter(typeof(AnoConverter))] 
    public string ano { get; set; } 
} 

"класс Root"

public class RootObject 
{ 
    public List<Dado> dados { get; set; } 
} 

Затем, вы можете создать собственный JsonConverter манипулировать десериализации вашего JSON:

public class AnoConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     throw new NotImplementedException(); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     //This deserialize the Ano into a Dictionary, 
     //and returns the Key that contains the actual Year you want 

     var ano = serializer.Deserialize<Dictionary<string, object>>(reader); 

     //I'm assuming that there will be always one year here. 
     return ano.FirstOrDefault().Key; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Теперь в вашей программе, просто сделать это десериализовать ваш JSON в ваш строго типизированного класса:

//Just reading the json from a file, nothing new here... 
string json = String.Empty; 
using (StreamReader r = new StreamReader("example.json")) 
{ 
    json = r.ReadToEnd(); 
} 

//Deserialize in json into a "RootObject" 
var list = JsonConvert.DeserializeObject<RootObject>(json); 

Это даст вам результат: enter image description here

Примечание Вы можете сделать тот же процесс создания настраиваемого JsonConverter для вашего поля populacao, но вместо доступа к ключу вы получите доступ к значению. Та же логика. Я не сделал это нарочно, так что вы можете сделать это сами и учиться :)

+0

Это сработало для меня, но я выпустил, что имя свойства класса Dado должно быть тем же самым свойством Json, знаете ли вы, как это изменить? Существует проблема, потому что 'populacao' не является допустимым именем свойства. –

+0

Спасибо, что ответили на вопрос, кстати, –

+0

Да, это нужно для маха. Однако вы можете использовать атрибут JsonProperty, чтобы украсить свойство и присвоить ему собственное имя. См. Ответ здесь: http: //stackoverflow.com/questions/8796618/how-can-i-change-property-names-when-serializing-with-json-net. Я не понимаю, что вы сказали о проблеме populacao. Это выглядит хорошо для меня .. – jpgrassi

0

Используйте следующий метод для разбора JSON из NSData

func parseJSON(data: NSData) -> ([String : AnyObject]?, NSError?) { 

     var parsingError: NSError? = nil 
     let parsedResult: [String : AnyObject]? 
     do { 

      parsedResult = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments) as? [String : AnyObject] 
     } catch let error as NSError { 

      parsingError = error 
      parsedResult = nil 
     } 
     return (parsedResult, parsingError) 
    } 

Если вы не имеете JSON в NSData Преобразовать JSON в NSData, используя следующие функция:

func jsonToNSData(json: AnyObject) -> NSData?{ 
    do { 
     return try NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted) 
    } catch let myJSONError { 
     print(myJSONError) 
    } 
    return nil; 
}