Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中使用JSON.Net查询和枚举复杂的JSON对象#_C#_Json_Linq_Json.net_Linq To Json - Fatal编程技术网

C# 如何在C中使用JSON.Net查询和枚举复杂的JSON对象#

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数据示例中发现了打字错误 但是如何使用键名

如何使用C#中的JSON.NET查询(查看属性是否存在)和枚举(数组属性)在复杂JSON对象中找到的内容?

我从一个API接收到一个复杂的JSON对象,该API具有可变数量/类型的属性

我一直在阅读、回顾样本等,但还没走多远,就迷上了JObject、JArray、JToken、使用dynamic等等

我想找到
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];
}