2016-04-13 61 views
0

我需要的属性的对象的属性名称:如何解析JSON对象用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>,并通过访问字典的Key属性来获取实际的ano。 请参见下面的你如何能做到这样一个例子:

“:

假设你可以在你的程序中使用第三方库,你几乎可以通过添加Json.Net到你的项目减少所有代码本墙裙”类

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

“根” 级

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

您可以执行为您的populacao字段创建自定义JsonConverter的相同过程,但不是访问该密钥,而是访问该值。同样的逻辑。我没有这样做的目的,所以你可以自己动手,并学习:)

+0

这工作对我来说,但我发布的Dado类属性的名称必须是JSON属性相同,你知道如何改变这个?有一个问题,因为“populacao”它不是一个有效的属性名称。 –

+0

谢谢你回答这个问题,顺便说一句 –

+0

是的,它必须马克。但是,您可以使用JsonProperty属性来修饰该属性并为其指定一个自定义名称。在这里看到答案:http://stackoverflow.com/questions/8796618/how-can-i-change-property-names-when-serializing-with-json-net。我不明白你所说的民众问题。我看起来很好.. – jpgrassi

0

使用使用以下方法从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如果您没有在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; 
}