如何循环遍历 C# 中的嵌套 JSON 对象? 数据模型循环数据命名约定

问题描述

我正在处理一个 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","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","tags": [
                "Tag7","Tag8"
            ]
        }
    }
}

有了这个响应,我想遍历位于 data 内的所有对象。 data 中的对象数量并不总是相同的;可能只有一个或十个对象。

我遇到的问题是我无法循环遍历 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());
}

JsonParser.cs

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

如何遍历 data 中的所有对象而不使用 obj1obj2调用它们?

解决方法

这里的问题是您的 JSON 架构为 data 定义了一个字典,但您的 data 属性返回 Objects 类的单个实例

数据模型

您希望 Response 类看起来像这样:

public class Response
{
    public string version { get; set; }
    public Dictionary<string,Objects> data { get; set; }
}

其他一切都应该没问题。

循环数据

鉴于上述内容,您现在可以使用以下内容遍历 data 字典:

foreach (var obj in JsonResponse.data)
{
    Console.WriteLine(obj.Key);
}

注意:当循环遍历 Dictionary<TKey,TValue> 时,将返回 KeyValuePair<TKey,TValue> 的枚举,并且您的键(即 obj1)位于 { {1}} 属性,以及您在 Key 属性中的对象。

命名约定

显然,名称 Value 在这里没有意义,因为它代表单个对象,而不是对象的集合。为了与您的代码保持一致,我将其保留为 Objects,但您需要给它一个单数名称。我想这只是您希望它代表一个集合而遗留下来的。