C# 如何在C中使用JSON.Net查询和枚举复杂的JSON对象#
如何使用C#中的JSON.NET查询(查看属性是否存在)和枚举(数组属性)在复杂JSON对象中找到的内容? 我从一个API接收到一个复杂的JSON对象,该API具有可变数量/类型的属性 我一直在阅读、回顾样本等,但还没走多远,就迷上了JObject、JArray、JToken、使用dynamic等等 我想找到C# 如何在C中使用JSON.Net查询和枚举复杂的JSON对象#,c#,json,linq,json.net,linq-to-json,C#,Json,Linq,Json.net,Linq To Json,如何使用C#中的JSON.NET查询(查看属性是否存在)和枚举(数组属性)在复杂JSON对象中找到的内容? 我从一个API接收到一个复杂的JSON对象,该API具有可变数量/类型的属性 我一直在阅读、回顾样本等,但还没走多远,就迷上了JObject、JArray、JToken、使用dynamic等等 我想找到pageResponses.scriptOutput属性,验证它是否包含和.items[]数组,然后枚举/迭代该数组 编辑 我取得了进展,在JSON数据示例中发现了打字错误 但是如何使用键名
pageResponses.scriptOutput
属性,验证它是否包含和.items[]
数组,然后枚举/迭代该数组
编辑
我取得了进展,在JSON数据示例中发现了打字错误
但是如何使用键名(例如(item.location,item.timestamp
)查询/枚举子对象呢
我建议创建一个代理类(我使用):
公共类后端
{
公共字符串os{get;set;}
公共字符串id{get;set;}
公共int请求处理{get;set;}
}
公共类元
{
公共布尔输出{get;set;}
公共后端{get;set;}
}
公共类页面请求
{
公共字符串renderType{get;set;}
公共布尔输出{get;set;}
}
公共类框架数据
{
公共字符串名称{get;set;}
public int childCount{get;set;}
}
公开课活动
{
公共字符串密钥{get;set;}
公共字符串时间{get;set;}
}
公共类脚本输出
{
公共列表项{get;set;}
}
公共类页面响应
{
公共页面请求页面请求{get;set;}
公共框架数据框架数据{get;set;}
公共列表事件{get;set;}
公共脚本输出脚本输出{get;set;}
公共int状态码{get;set;}
}
公开课内容
{
公共字符串名称{get;set;}
公共字符串编码{get;set;}
}
公共类页面
{
公共字符串renderType{get;set;}
公共布尔输出{get;set;}
}
公共类原始请求
{
公共列表页{get;set;}
}
公共类根对象
{
公共元{get;set;}
公共列表页面响应{get;set;}
公共int状态码{get;set;}
公共内容{get;set;}
public OriginalRequest OriginalRequest{get;set;}
}
然后反序列化它:
var obj = JsonConvert.DeserializeObject<RootObject>(json);
if (obj != null && obj.pageResponses != null)
{
foreach (var pageResponse in obj.pageResponses)
{
if (pageResponse.scriptOutput == null)
continue;
foreach (var item in pageResponse.scriptOutput.items)
{
Console.WriteLine(item);
}
}
}
var obj=JsonConvert.DeserializeObject(json);
if(obj!=null&&obj.pageResponses!=null)
{
foreach(对象pageResponses中的变量pageResponse)
{
if(pageResponse.scriptOutput==null)
继续;
foreach(pageResponse.scriptOutput.items中的变量项)
{
控制台写入线(项目);
}
}
}
我建议创建一个代理类(我使用过):
公共类后端
{
公共字符串os{get;set;}
公共字符串id{get;set;}
公共int请求处理{get;set;}
}
公共类元
{
公共布尔输出{get;set;}
公共后端{get;set;}
}
公共类页面请求
{
公共字符串renderType{get;set;}
公共布尔输出{get;set;}
}
公共类框架数据
{
公共字符串名称{get;set;}
public int childCount{get;set;}
}
公开课活动
{
公共字符串密钥{get;set;}
公共字符串时间{get;set;}
}
公共类脚本输出
{
公共列表项{get;set;}
}
公共类页面响应
{
公共页面请求页面请求{get;set;}
公共框架数据框架数据{get;set;}
公共列表事件{get;set;}
公共脚本输出脚本输出{get;set;}
公共int状态码{get;set;}
}
公开课内容
{
公共字符串名称{get;set;}
公共字符串编码{get;set;}
}
公共类页面
{
公共字符串renderType{get;set;}
公共布尔输出{get;set;}
}
公共类原始请求
{
公共列表页{get;set;}
}
公共类根对象
{
公共元{get;set;}
公共列表页面响应{get;set;}
公共int状态码{get;set;}
公共内容{get;set;}
public OriginalRequest OriginalRequest{get;set;}
}
然后反序列化它:
var obj = JsonConvert.DeserializeObject<RootObject>(json);
if (obj != null && obj.pageResponses != null)
{
foreach (var pageResponse in obj.pageResponses)
{
if (pageResponse.scriptOutput == null)
continue;
foreach (var item in pageResponse.scriptOutput.items)
{
Console.WriteLine(item);
}
}
}
var obj=JsonConvert.DeserializeObject(json);
if(obj!=null&&obj.pageResponses!=null)
{
foreach(对象pageResponses中的变量pageResponse)
{
if(pageResponse.scriptOutput==null)
继续;
foreach(pageResponse.scriptOutput.items中的变量项)
{
控制台写入线(项目);
}
}
}
我通过几个扩展方法来实现这一点,并使用JsonConvert.DeserializeObject
下面是代码片段
用法
ExpandoObject data = JsonConvert.DeserializeObject<ExpandoObject>(jsonString);
if(data.HasProperty("propertyToCheck"))
{
object[] objects = data.Get<object[]>("propertyToCheck");
}
ExpandoObject data=JsonConvert.DeserializeObject(jsonString);
if(data.HasProperty(“propertyToCheck”))
{
object[]objects=data.Get(“propertyToCheck”);
}
在上面的代码段中,我检查属性是否存在,然后将其分配给.Net类型,在本例中为对象数组。虽然它可以是任何类型,只要它是理智的
扩展方法
public static bool HasProperty(this ExpandoObject value, string property)
{
bool hasProp = false;
if (((IDictionary<String, object>)value).ContainsKey(property))
{
hasProp = true;
}
return hasProp;
}
public static T Get<T>(this ExpandoObject value, string property)
{
return (T)((IDictionary<String, dynamic>)value)[property];
}
publicstaticboolhasproperty(这个ExpandoObject值,string属性)
{
bool hasProp=false;
if(((IDictionary)值).ContainsKey(属性))
{
hasProp=true;
}
返回hasProp;
}
公共静态T Get(此ExpandooObject值,字符串属性)
{
返回(T)((i字典)值)[属性];
}
快,简单,切中要害 我通过几个扩展方法来实现这一点,并使用JsonConvert.DeserializeObject 下面是代码片段 用法
ExpandoObject data = JsonConvert.DeserializeObject<ExpandoObject>(jsonString);
if(data.HasProperty("propertyToCheck"))
{
object[] objects = data.Get<object[]>("propertyToCheck");
}
ExpandoObject data=JsonConvert.DeserializeObject(jsonString);
if(data.HasProperty(“propertyToCheck”))
{
object[]objects=data.Get(“propertyToCheck”);
}
在上面的代码段中,我检查属性是否存在,然后将其分配给.Net类型,在本例中为对象数组。虽然它可以是任何类型,只要它是理智的
扩展方法<
public static bool HasProperty(this ExpandoObject value, string property)
{
bool hasProp = false;
if (((IDictionary<String, object>)value).ContainsKey(property))
{
hasProp = true;
}
return hasProp;
}
public static T Get<T>(this ExpandoObject value, string property)
{
return (T)((IDictionary<String, dynamic>)value)[property];
}