Netwonsoft JSON 反序列化为具有命名条目的列表

Netwonsoft JSON deserialize into List with named entries

我想反序列化这个 JSON:

{
  "Home1": [
    {
      "name": "Hans",
      "age": 20
    },
    {...}
  ],
  "Home2": [
    {...},
    {...}
  ]
}

变成 List<House> 这些 classes:

class Person {
  public string Name { get; set; }
  public int Age { get; set; }
}
class House : List<Person> {
  public string Name { get; set; }
}

如何告诉 Newtonsoft JSON House.Name 应该用于密钥 (Home1)?

PS:class结构不固定,但是我需要房子的名字是class中的属性。

Json parsing/deserialization 这样不行。

您必须具有与 json 相同结构的 class。

您的来源 json 是具有 属性 Home1、Home2 等的对象

但你直接期望它转换成另一种结构。

建议先将Real object中的json转换为json的结构。然后遍历 属性 并用 List.

中的循环填充它

也请你解释一下这个 class 应该做什么。

class House : List<Person> { public string Name { get; set; } }

对我来说这没有任何意义。

抛开继承列表和您的 class 结构的想法,您当然可以创建 custom converter 但我认为更简单的选择是将 json 反序列化为Dictionary<string, House>(可以代表你的json结构)然后手动映射名称:

var result = JsonConvert.DeserializeObject<Dictionary<string, House>>(json);
foreach (var kvp in result)
{
    kvp.Value.Name = kvp.Key;
}

var houses = result.Values;

试试这个

   var deserializedJson = JsonConvert.DeserializeObject<Dictionary<string, List<Person>>>(json);
    
    var houses=new List<House>();
    
    foreach (var element in deserializedJson)
    {
        houses.Add(new House { Name = element.Key, Persons = element.Value} );
    }
   var result=JsonConvert.SerializeObject(houses);
 }

结果

[
  {
    "Name": "Home1",
    "Persons": [
      {
        "Name": "Hans",
        "Age": 20
      }
    ]
  },
  {
    "Name": "Home2",
    "Persons": [
      {
        "Name": "John",
        "Age": 22
      }
    ]
  }
]

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class House 
{
public string Name { get; set; }
public List<Person> Persons {get; set;}
}

根据您的要求回答,

我们如何在反序列化和使用 REGEX 对其进行修饰之前清理您的 JSON 字符串?

string json = @"{
    ""Home1"": [
    {
        ""name"": ""Hans"",
        ""age"": 20
    },
    {
        ""name"": ""Hans"",
        ""age"": 20
    },
    ],
    ""Home2"": [
    {
        ""name"": ""Hans"",
        ""age"": 20
    },
    {
        ""name"": ""Hans"",
        ""age"": 20
    },
    ]
}";

/*Replaces all Home + Digit combination to Home*/
json = Regex.Replace(json, @"Home\d*", "Home");

/* Output
{
    "Home": [
    {
        "name": "Hans",
        "age": 20
    },
    {
        "name": "Hans",
        "age": 20
    },
    ],
    "Home": [
    {
        "name": "Hans",
        "age": 20
    },
    {
        "name": "Hans",
        "age": 20
    },
    ]
}
*/