【问题标题】:Deserialize JSON to C# object to display nested array as string in grid将 JSON 反序列化为 C# 对象以在网格中将嵌套数组显示为字符串
【发布时间】: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。谢谢你,恩科西。下一次,我会在问题和格式上更准确。
  • 展示如何在反序列化后将数据分配给数据网格..

标签: c# arrays json winforms 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[])
                ? $"\t{x.Name} = x.{x.Name}"
                : $"\t{x.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; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-20
      • 2020-06-09
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      相关资源
      最近更新 更多