C# 带有多个数组的JSON到C arraylist或list或自定义对象,并显示为详细信息
我在一个文件中有下面的JSON内容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": [{
[{
"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} )")));