【问题标题】:Netwonsoft JSON deserialize into List with named entriesNewtonsoft JSON 反序列化为带有命名条目的列表
【发布时间】:2021-11-23 10:18:11
【问题描述】:

我想反序列化这个 JSON:

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

转为List<House> 使用这些类:

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:类结构不固定,但我需要房子的名字是一个类中的属性。

【问题讨论】:

  • stackoverflow.com/a/17038878/8133524 看看这个希望对你有帮助:)
  • 你能显示你想要的json吗?
  • 我会说继承List 通常是一个有问题的设计选择。
  • 您应该将 List 作为 House 类中的属性。不要只继承 List。人和房子是两个不同的东西

标签: c# json json.net deserialization


【解决方案1】:

试试这个

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

【讨论】:

    【解决方案2】:

    根据您的要求提供答案,

    我们在使用 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
        },
        ]
    }
    */
    
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        Json 解析/反序列化不能以这种方式工作。

        您必须具有相同结构的类,即 json 是什么。

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

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

        我建议先将Real对象中的json转换成json的结构。然后循环遍历该属性并用 List 中的循环填充它。

        你能解释一下这门课应该做什么吗?

        class House : List&lt;Person&gt; { public string Name { get; set; } }

        对我来说没有任何意义。

        【讨论】:

          猜你喜欢
          • 2013-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-18
          • 1970-01-01
          相关资源
          最近更新 更多