首页 > 解决方案 > 具有多个数组的 JSON 到 C# 数组列表或列表或自定义对象并显示为详细信息

问题描述

我在一个文件中有以下 JSON 内容。

[{
        "projectCode": "ICSM000003SM_Prj1",
        "name": "Story mapping",
        "id": "5eeb94710ce4e01aac9ac3e2",
        "workRequests": [{
                "name": "test issue",
                "project": "5eeb94710ce4e01aac9ac3e2",
                "id": "5eeb94930ce4e01aac9ac3ef",
                "url": "http://example.com/form?collectorid=5eeb94930ce4e01aac9ac3ef&icentid=5e8eff6b99ba793a08461372&projectid=5eeb94710ce4e01aac9ac3e2&source=mail"
            },
            {
                "name": "defect issue collector",
                "project": "5eeb94710ce4e01aac9ac3e2",
                "id": "5eee564170e0d814d0dd5288",
                "url": "http://example.com/form?collectorid=5eee564170e0d814d0dd5288&icentid=5e8eff6b99ba793a08461372&projectid=5eeb94710ce4e01aac9ac3e2&source=mail"
            }
        ]
    },
    {
        "projectCode": "ICSM000001IC100",
        "name": "issue collector",
        "id": "5e8eff7c99ba793a08461375",
        "workRequests": [{
                "name": "SE issue collector",
                "project": "5e8eff7c99ba793a08461375",
                "id": "5e96864599ba7923a488194a",
                "url": "http://example.com/form?collectorid=5e96864599ba7923a488194a&icentid=5e8eff6b99ba793a08461372&projectid=5e8eff7c99ba793a08461375&source=mail"
            },
            {
                "name": "test",
                "project": "5e8eff7c99ba793a08461375",
                "id": "5ee36aef1ad1de3c10fa9aa6",
                "url": "http://example.com/form?collectorid=5ee36aef1ad1de3c10fa9aa6&icentid=5e8eff6b99ba793a08461372&projectid=5e8eff7c99ba793a08461375&source=mail"
            }
        ]
    },
    {
        "projectCode": "ICSM000005SM_SP",
        "name": "Single project sm",
        "id": "5eee566970e0d814d0dd5289",
        "workRequests": [{
            "name": "feedback collector",
            "project": "5eee566970e0d814d0dd5289",
            "id": "5eee568c70e0d814d0dd5296",
            "url": "http://example.com/form?collectorid=5eee568c70e0d814d0dd5296&icentid=5e8eff6b99ba793a08461372&projectid=5eee566970e0d814d0dd5289&source=mail"
        }]
    }
]

注意:以上 JSON 内容是动态的。它的格式是相同的,但是当我从应用程序中使用 REST API 时,所有值都可能会发生变化。

下面是我将 JSON 转换为树视图的代码,但我想以列表或详细信息格式显示它。

public static void AddObjectNodes(JObject @object, string name, TreeNodeCollection parent)
    {
        var node = new TreeNode(name);
    //    if ()
        parent.Add(node);

        foreach (var property in @object.Properties())
        {
            AddTokenNodes(property.Value, property.Name, node.Nodes);
        }
    }
    private static void AddTokenNodes(JToken token, string name, TreeNodeCollection parent)
    {
        if (token is JValue)
        {
            parent.Add(new TreeNode(string.Format("{0}: {1}", name, ((JValue)token).Value)));
        }
        else if (token is JArray)
        {
            AddArrayNodes((JArray)token, name, parent);
        }
        else if (token is JObject)
        {
            AddObjectNodes((JObject)token, name, parent);
        }
    }
    private static void AddArrayNodes(JArray array, string name, TreeNodeCollection parent)
    {
        var node = new TreeNode(name);
        parent.Add(node);

        for (var i = 0; i < array.Count; i++)
        {
        AddTokenNodes(array[i], string.Format("[{0}]", i), node.Nodes);
        }
    }



var @object = JObject.Parse(json);
        AddObjectNodes(@object, "JSON", treeView.Nodes);

我的问题是我得到这样的输出

在此处输入图像描述

我想要下面的列表格式。如何处理 JSON 以在C# Windows 窗体中获取此数据?

我正在使用 Newtonsoft Json.NET。有没有办法把它分解成一个数组列表?

---Work requestname ( Story mapping)
---Work requestname ( Story mapping)
---Work requestname ( Issue Collector)
---Work requestname ( Issue Collector)

等等针对不同的工作请求

我很难为我的 JSON 内容生成一个类。所有在线类生成器都会为每个项目生成一个类,例如我有 project1、project2 等,因为我的 REST API 将提供多个项目,并且无法每次都在旅途中创建一个类。

这家伙有他的班级排序

标签: c#jsonwinformsjson.net

解决方案


您可以使用 Newtonsoft.Json.Linq 反序列化原始 JSON 内容,然后反序列化您的项目(我假设使用动态名称)。您可以查看每个项目并显示ProjectObject包含您的姓名和 URL 的项目。

public class ProjectObject
{
    [JsonProperty("name")]
    public string Name { get; set; }
    [JsonProperty("url")]
    public string Url { get; set; }
}

并在您的 main 中使用以下内容来反序列化 JSON 内容并检查每个项目(project1、project2、projectn)。

var jobj = JObject.Parse(json);
foreach(var prop in jobj.Properties())
{
    // prop.Name is the name of the project you are iterating over.
    var project = JsonConvert.DeserializeObject<List<ProjectObject>>(jobj[prop.Name].ToString());
}

更新的答案

您可以使用以下类来反序列化您发布的新 JSON 内容。

public class Class1
{
    [JsonProperty("projectCode")]
    public string ProjectCode { get; set; }
    [JsonProperty("name")]
    public string Name { get; set; }
    [JsonProperty("id")]
    public string Id { get; set; }
    [JsonProperty("workRequests")]
    public List<Workrequest> WorkRequests { get; set; }
}

public class Workrequest
{
    [JsonProperty("name")]
    public string Name { get; set; }
    [JsonProperty("Pame")]
    public string Project { get; set; }
    [JsonProperty("id")]
    public string Id { get; set; }
    [JsonProperty("url")]
    public string Url { get; set; }
}

// And in your main, or other function, you can access your items via for loop or foreach. Ex to print all requests,
var obj = JsonConvert.DeserializeObject<List<Class1>>(json);
obj.ForEach(item => item.WorkRequests.ForEach(request => Console.WriteLine($"---Work {request.Name} ( {item.Name} )")));


推荐阅读