将JSON反序列化为C#对象以将嵌套数组显示为网格中的字符串

时间:2018-07-26 20:49:39

标签: c# arrays json winforms datagridview

一切正常,然后反序列化确定。除了角色以外,其他信息都显示为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);

3 个答案:

答案 0 :(得分:2)

正如@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>());
    }
    
  • 或通过更改DataSource中的DataGridView

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

答案 1 :(得分:1)

您的班级有两次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; }
}

答案 2 :(得分:1)

如果我正确理解,您似乎想获得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; }
}