将 JSON 反序列化为 C# 对象以在网格中将嵌套数组显示为字符串
Posted
技术标签:
【中文标题】将 JSON 反序列化为 C# 对象以在网格中将嵌套数组显示为字符串【英文标题】:Deserialize JSON to C# object to display nested array as string in grid 【发布时间】:2019-01-03 22:48:14 【问题描述】:一切运行并反序列化OK。除了角色显示为 System.Collections.Generic.List`1[System.String]
问题
如果我想将每个字段附加到网格。有没有办法在不循环 Roles 属性的情况下将集合显示为字符串?
JSON
[
"Name":"test",
"Email": "test@test.com",
"Roles": ["Admin","User","Guest"],
"Age":"23"
,
"Name":"test1",
"Email": "test1@test.com",
"Roles": ["Admin", "User" ,"Guest"],
"Age":"33"
]
型号
public class example
public string Name get; set;
public string Email get; set;
public IList<string> Roles get; set;
public string Age get; set;
反序列化
List<Exampe> list = JsonConvert.DeserializeObject<List<Exampe>>(bundle);
【问题讨论】:
您需要澄清实际问题是什么,因为上面显示的所有内容都应该按预期工作。默认情况下,角色将根据属性显示的类型反序列化为字符串列表。 您使用的是什么平台?如果 Xaml 使用值转换器。 以后请注意,这样的问题似乎是XY problem。请记住,在大多数情况下,提供minimal reproducible example 应该有助于澄清实际问题。 我正在使用 Windows 窗体 DataGridView。谢谢你,恩科西。下一次,我会在问题和格式上更准确。 展示如何在反序列化后将数据分配给数据网格.. 【参考方案1】:正如@Nkosi 提到的,这是一个 XY 问题。问题不在于反序列化,而在于DataGridView
如何处理“复杂”的属性类型。
您可以添加一个新属性来显示它:
或者直接修改类定义:
public class Example
public string Name get; set;
public string Email get; set;
public string[] Roles get; set;
public string Age get; set;
public string RolesText => string.Join(", ", Roles ?? Array.Empty<string>());
或者通过改变DataGridView
的DataSource
:
dgv.DataSource = list.Select(x => new
x.Name, x.Email, x.Age,
Roles = string.Join(", ", x.Roles ?? Array.Empty<string>()),
).ToList();
--
奖励:这是第二种方法的生成器:
string GenerateModelFormatter<T>()
return new StringBuilder()
.AppendLine("x => new")
.AppendLine("")
.AppendLine(string.Join(",\n", typeof(T).GetProperties()
.Select(x => x.PropertyType != typeof(string[])
? $"\tx.Name = x.x.Name"
: $"\tx.Name = string.Join(\", \", x.x.Name ?? Array.Empty<string>())")))
.AppendLine("")
.ToString();
【讨论】:
我个人更喜欢第二种选择。干净简单。 谢谢大家的帮助。我害怕不得不做这样的事情,因为我正在处理一个具有 300 多个属性的类,其中 50% 将是一个字符串 [] 数组。现在做出重大决定.. 您可以使用反射或元编程来生成 lambda 函数: 这有点超出我的知识范围,但如果你能指出正确的方向,我愿意学习。【参考方案2】:您的班级中有两次Name
- 您可能想要:
public class example
public string Name get; set;
public string Email get; set;
public IList<string> Roles get; set;
public string Age get; set;
【讨论】:
【参考方案3】:如果我理解正确,您似乎想获得string[]
而不是List<string>
Roles
可以是string[]
public class Example
public string Name get; set;
public string Email get; set;
public string[] Roles get; set;
public string Age get; set;
【讨论】:
以上是关于将 JSON 反序列化为 C# 对象以在网格中将嵌套数组显示为字符串的主要内容,如果未能解决你的问题,请参考以下文章