C#反序列化带有ID节点的Json [重复]

Posted

技术标签:

【中文标题】C#反序列化带有ID节点的Json [重复]【英文标题】:C# deserialize Json with ID nodes [duplicate] 【发布时间】:2021-09-06 04:17:05 【问题描述】:

如何将 Json 反序列化为具有节点键 ID 的 C# 对象?例如:


  "people" : 
    "1": 
       "firstname": "jim",
       "lastname": "brown"
    ,
    "2": 
       "firstname": "kathy",
       "lastname": "jones"  
    
  

将序列化到这个 C# 类中

public class JsonRoot 
   public List<Person> People  get; set; 


public class Person 
   public int Id  get; set; 
   public string FirstName  get; set; 
   public string LastName  get; set; 

是否可以使用自定义通用转换器或 json 属性来做到这一点?

【问题讨论】:

List&lt;Person&gt; 替换为Dictionary&lt;string, Person&gt; 见:Query or deserialize json with dynamic keys using System.Text.Json,看起来是重复的,同意吗?还是您需要将 JSON 对象反序列化为列表? 您也许可以在 .NET 5 中使用 Dictionary&lt;int, Person&gt;,请参阅 devblogs.microsoft.com/dotnet/whats-next-for-system-text-json/…: Support non-string dictionary keys。 您的 Json 字符串和类不匹配。 people 是一个对象/字典,其键是数字,其值没有 Id 属性。您必须使用 matching 类对其进行反序列化,然后将它们映射到您想要的类 Dictionary 可以满足我的需要,谢谢! 【参考方案1】:

因为你的 json 数据中没有数组,所以这个 List 不会给出解决方案。

可以使用字典,这也是两级。第一个字典只包含一个键=人,它的值也是字典,它的键是“1”和“2”,值是人对象。

class Program

    static string jsonData = @"
                          ""people"" : 
                            ""1"": 
                               ""firstname"": ""jim"",
                               ""lastname"": ""brown""
                            ,
                            ""2"": 
                               ""firstname"": ""kathy"",
                               ""lastname"": ""jones""  
                            
                          
                        
                        ";
    static void Main(string[] args)
    
        var datatextjson = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, Person>>>(jsonData);
        Console.WriteLine("Hello World!");
    

    public class Person
    
        public string firstname  get; set; 
        public string lastname  get; set; 
    

【讨论】:

Newtonsoft.Json.JsonConvert.DeserializeObject -- 问题是关于system.text.json 而不是json.net。 已更正,几乎相同。

以上是关于C#反序列化带有ID节点的Json [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C# JSON 反序列化:如何从 JSON 对象数组中获取值 [重复]

使用 LitJson 在 C# 中反序列化 JSON 对象数组 [重复]

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

在调用API后,将JSON对象反序列化为C#类[重复]。

C#为JSON序列化和反序列化创建一个.NET对象[重复]

使用 C# Xml.Serialization 库反序列化每个重复的 XML 节点并将其映射到对象的属性