如何使用 C# 解析 JSON 对象与另一个子对象
How to parse JSON object with another object childen with 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:
var resultObjects = AllChildren(JObject.Parse(cidadesSON))
.First(c => c.Type == JTokenType.Array && c.Path.Contains("dados"))
.Children<JObject>();
List<Cidade> cidades = new List<Cidade>();
Cidade item;
//fetch my array
foreach (JObject result in resultObjects)
{
item = new Cidade();
item.localidade =(string)result["localidade"];
item.nome_localidad_pai = (string)result["nome_localidade_pai"];
item.populacao = (string)result["ano"]["2010"];
//my problem
item.ano = ((JObject)result.["ano"]).Property("2010").Name;
cidades.Add(item);
}
grvCandidatos.DataSource = cidades;
grvCandidatos.CssClass = "table table-hover ";
grvCandidatos.DataBind();
这是获取对象的方法
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;
}
}
}
如有必要,这是我的模型class:
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; }
}
如果有人能提供帮助,我将不胜感激。
(对不起我的英语。)
使用以下方法从 NSData
中解析 JSON
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)
}
如果你在 NSData 中没有 JSON
使用以下函数将 JSON 转换为 NSData:
func jsonToNSData(json: AnyObject) -> NSData?{
do {
return try NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted)
} catch let myJSONError {
print(myJSONError)
}
return nil;
}
TL;DR
您的代码存在的问题是我们不知道 ano
属性 的类型。您可以将 属性 映射到 Dictionary<string,object>
,然后通过访问字典的键 属性 获得实际的 ano
。
请参阅下面的示例,了解如何执行此操作:
假设您可以在您的程序中使用第 3 方库,您可以通过将 Json.Net 添加到您的项目中来减少所有代码:
"Dado" class
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" class
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 反序列化为您的强类型 class:
//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);
这会给你这样的结果:
备注
您可以执行为 populacao
字段创建自定义 JsonConverter 的相同过程,但您访问的不是键,而是值。同样的逻辑。我不是故意做的所以你可以自己做并学习:)
我需要 属性 对象的 属性 的名称:
这是我的代码:
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:
var resultObjects = AllChildren(JObject.Parse(cidadesSON))
.First(c => c.Type == JTokenType.Array && c.Path.Contains("dados"))
.Children<JObject>();
List<Cidade> cidades = new List<Cidade>();
Cidade item;
//fetch my array
foreach (JObject result in resultObjects)
{
item = new Cidade();
item.localidade =(string)result["localidade"];
item.nome_localidad_pai = (string)result["nome_localidade_pai"];
item.populacao = (string)result["ano"]["2010"];
//my problem
item.ano = ((JObject)result.["ano"]).Property("2010").Name;
cidades.Add(item);
}
grvCandidatos.DataSource = cidades;
grvCandidatos.CssClass = "table table-hover ";
grvCandidatos.DataBind();
这是获取对象的方法
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;
}
}
}
如有必要,这是我的模型class:
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; }
}
如果有人能提供帮助,我将不胜感激。
(对不起我的英语。)
使用以下方法从 NSData
中解析 JSON 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)
}
如果你在 NSData 中没有 JSON 使用以下函数将 JSON 转换为 NSData:
func jsonToNSData(json: AnyObject) -> NSData?{
do {
return try NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted)
} catch let myJSONError {
print(myJSONError)
}
return nil;
}
TL;DR
您的代码存在的问题是我们不知道 ano
属性 的类型。您可以将 属性 映射到 Dictionary<string,object>
,然后通过访问字典的键 属性 获得实际的 ano
。
请参阅下面的示例,了解如何执行此操作:
假设您可以在您的程序中使用第 3 方库,您可以通过将 Json.Net 添加到您的项目中来减少所有代码:
"Dado" class
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" class
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 反序列化为您的强类型 class:
//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);
这会给你这样的结果:
备注
您可以执行为 populacao
字段创建自定义 JsonConverter 的相同过程,但您访问的不是键,而是值。同样的逻辑。我不是故意做的所以你可以自己做并学习:)