c# - 具有多个数组的 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 将提供多个项目,并且无法每次都在旅途中创建一个类。
解决方案
您可以使用 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} )")));
推荐阅读
- excel - 如何在没有“内存不足”异常的情况下将大型 DataGridView 导出到 Excel?
- python - 使用包含索引列表python的变量检索列表元素
- pandas - 具有特定条件的 pandas DataFrame 中的加权平均值
- r - 当R中有多个值选项时,在每个ID中重复一个值
- python - 在 ItemSelectedChanged() 上获取当前项目 QListWidget
- automation - 是否可以通过某些脚本从交易页面获取数据?
- python - 如果这是可取的,那么在其中一个组件内访问类组合的正确方法是什么?
- sql - 将 Unicode/UTF-8 值转换为阿拉伯文本 | SQL 服务器
- c - C共享内存现有标志?
- c# - YamlDotNet 根据值更改属性名称