Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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#中的嵌套JSON对象?_C#_Json_Json.net_Json Deserialization - Fatal编程技术网

如何循环使用C#中的嵌套JSON对象?

如何循环使用C#中的嵌套JSON对象?,c#,json,json.net,json-deserialization,C#,Json,Json.net,Json Deserialization,我正在从事一个C#项目,需要调用API并通过JSON响应进行解析 JSON响应: { "version": "3.9.1", "data": { "obj1": { "version": "1.0.0", "id": "obj1",

我正在从事一个C#项目,需要调用API并通过JSON响应进行解析

JSON响应:

{
    "version": "3.9.1",
     "data": {
        "obj1": {
            "version": "1.0.0",
            "id": "obj1",
            "name": "Object 1",
            "title": "Object 1",
            "info": {
                "info1": 8,
                "info2": 4,
                "info3": 3
            },
            "image": {
                "full": "Object1.png",
                "w": 64,
                "h": 64
            },
            "tags": [
                "Tag1",
                "Tag2"
            ]
        },
        "obj2": {
            "version": "1.0.0",
            "id": "obj2",
            "name": "Object 2",
            "title": "Object 2",
            "info": {
                "info1": 1,
                "info2": 6,
                "info3": 7
            },
            "image": {
                "full": "Object2.png",
                "w": 64,
                "h": 64
            },
            "tags": [
                "Tag1",
                "Tag6"
            ]
        },
        "obj3": {
            "version": "1.0.0",
            "id": "obj3",
            "name": "Object 3",
            "title": "Object 3",
            "info": {
                "info1": 0,
                "info2": 1,
                "info3": 2
            },
            "image": {
                "full": "Object3.png",
                "w": 64,
                "h": 64
            },
            "tags": [
                "Tag7",
                "Tag8"
            ]
        }
    }
}
有了这个响应,我想遍历
数据
中的所有对象。
数据
中的对象数量并不总是相同的;可能只有一个或十个对象

我遇到的问题是,由于以下错误,我无法循环使用
data
属性:

foreach语句无法对“Objects”类型的变量进行操作,因为“Objects”不包含“GetEnumerator”的公共实例或扩展定义

我知道为什么会出错,但我找不到解决问题的方法

我的代码:

MainWindow.xaml.cs

WebRequest request = WebRequest.Create(path);
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());

string ReaderJson = reader.ReadToEnd();

var JsonResponse = JsonConvert.DeserializeObject<Response>(ReaderJson);

foreach (var obj in JsonResponse.data)
{
    Console.WriteLine(obj.ToString());
}
    public class Response
    {
        public string version { get; set; }
        public Objects data { get; set; }
    }

    public class Objects
    {
        public string id { get; set; }
        public string name { get; set; }
        public string title { get; set; }
        public Info info { get; set; }
        public Images images { get; set; }
    }

    public class Info
    {
        public int info1 { get; set; }
        public int info2 { get; set; }
        public int info3 { get; set; }
    }

    public class Images
    {
        public string full { get; set; }
        public int w { get; set; }
        public int h { get; set; }
    }

如何在不使用
obj1
obj2
等调用的情况下循环遍历
data
中的所有对象?

这里的问题是,您的JSON模式为
数据定义了一个字典,但是
数据
属性返回
对象
类的单个实例

数据模型 您希望您的
响应
类看起来像这样:

公共类响应
{
公共字符串版本{get;set;}
公共字典数据{get;set;}
}
其他一切都应该很好

循环浏览数据 鉴于上述情况,您现在可以使用以下方法循环查看
数据
字典:

foreach(JsonResponse.data中的var obj)
{
控制台写入线(对象键);
}
注意:当在
字典中循环时,将返回
KeyValuePair
的枚举,其中键(即
obj1
)位于
key
属性中,对象位于
Value
属性中

命名约定
显然,名称
Objects
在这里没有意义,因为它代表单个对象,而不是对象的集合。为了与您的代码保持一致,我保留了它
Objects
,但您需要给它一个单数名称。我想这是你想让它代表一个收藏而留下的。

@Milkshake先生:很高兴听到这个消息!另外,如果您控制数据,另一种方法是将
数据
作为JSON中的数组,然后将其映射到
集合
——或者,如果您仍然希望对其进行键控,然后根据您的
id
属性创建一个
KeyedCollection
。是的,如果数据确实是一个数组,那么这会容易得多,但遗憾的是,JSON是来自API的响应,我无法更改它:(但是,
KeyedCollection
是一个很好的选择,我会尝试一下:我猜数据不是你所想的那样。它看起来像是一个对象,而不是一个集合。你的数据模型没有映射到你的JSON数据。你的
data
属性应该是一个
字典。(顺便说一句,这里的类名
Objects
有点奇怪;只有集合才应该命名为复数。)啊,好的,谢谢!是的,我后来想重命名Objects类,但我首先想解决这个问题。这是一个糟糕的做法,我很遗憾经常这样做。仅供参考:我将该评论形式化,作为一个更详细的回答,尽管听起来你已经从我的评论中获得了要点。让我知道这是否适用于你!