C# 带有多个数组的JSON到C arraylist或list或自定义对象,并显示为详细信息

C# 带有多个数组的JSON到C arraylist或list或自定义对象,并显示为详细信息,c#,json,winforms,json.net,C#,Json,Winforms,Json.net,我在一个文件中有下面的JSON内容 [{ "projectCode": "ICSM000003SM_Prj1", "name": "Story mapping", "id": "5eeb94710ce4e01aac9ac3e2", "workRequests": [{

我在一个文件中有下面的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内容是动态的。它的格式是相同的,但是当我从应用程序中使用RESTAPI时,所有的值都可能会改变

下面是我将JSON转换为treeview的代码,但我希望以列表或详细信息格式显示它

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内容生成一个类。所有在线类生成器都会为每个项目生成一个类,就像我有project1、project2等一样,因为我的RESTAPI将提供多个项目,并且不能每次都创建一个类

Name是属性的名称,而不是Name属性的值

试一试

相反

我很难为我的JSON内容生成一个类。所有在线类生成器都会为每个项目生成一个类,就像我有project1、project2等一样,因为我的RESTAPI将提供多个项目,并且不能每次都创建一个类


您不需要每次都创建一个新类。这就是动态Newtonsoft JSON类的用途。

您可以使用Newtonsoft.JSON.Linq来反序列化原始JSON内容,然后使用动态名称反序列化您的项目。您可以浏览每个项目并显示包含您的姓名和URL的ProjectObject

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


通常,您希望避免将变量和参数命名为对象或数组,因为除了会遇到保留字命名冲突外,这些名称不是非常具有信息性。Dynamic意味着格式更改。更改值是一种正常行为。为什么不使用列表而不是数组列表。整个代码只是一个类定义和一行反序列化。这能回答你的问题吗?我很难为我的json生成类所有在线类生成器为每个项目生成类,就像我的project1一样,project2&等等,因为我的restapi将提供多个项目,不能每次在gohi上创建类,我对这个json是新手,我现在有了不同的json和实际数据,你能帮我生成并循环吗??我的预期输出与问题中提到的相同,只是我的json已更改,这是最后一个。我正在更新有问题的json我能够在JArray@Dandy你完全改变了问题。这个json没有project1、project2等等。这个新的json有一个标准格式,当然有不同的值。不知道它有什么动态性都德,非常感谢它的工作,关于json,我知道,当我得到更新的需求时,我改变了问题,但再次感谢
public class ProjectObject
{
    [JsonProperty("name")]
    public string Name { get; set; }
    [JsonProperty("url")]
    public string Url { get; set; }
}
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());
}
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} )")));