将 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>());

或者通过改变DataGridViewDataSource

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&lt;string&gt;

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# 对象以在网格中将嵌套数组显示为字符串的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 字符串反序列化为多个 C# 对象

无法将 JSON 数组反序列化为 C# 对象 [关闭]

无法将 JSON 字符串反序列化为 C# 对象

将嵌套的 JSON 反序列化为 C# 对象

C#使用Json

如何将带有子属性的 JSON 反序列化为 C# 中的 ONE 对象