【问题标题】:Query or deserialize json with dynamic keys using System.Text.Json使用 System.Text.Json 使用动态键查询或反序列化 json
【发布时间】:2020-05-22 04:11:09
【问题描述】:

我有这样的 json,键“123”可以是任何数字。

 {
   "key1": "",
   "key2": {
      "items": {
         "123": {
            "pageid": 123,
            "name": "data"
         }
      }
    }
 }

我想反序列化或使用 System.Text.Json 查询 json,以便我可以获取键“名称”的值。如何使用 System.Text.Json 做到这一点?我正在使用 .NET Core 3.1。

【问题讨论】:

    标签: c# .net json .net-core system.text.json


    【解决方案1】:

    由于其中一个 json 键可以变化 ("123"),因此可以用 Dictionary<> 表示。以下类为您的 json 建模。

    public class ItemProps
    {
        public int pageid { get; set; }
        public string name { get; set; }
    }
    
    public class Item
    {
        public Dictionary<string, ItemProps> items { get; set; }
    }
    
    public class Root
    {
        public string key1 { get; set; }
        public Item key2 { get; set; }
    }
    

    然后使用 System.Text.Json 反序列化您将使用:

    var data = JsonSerializer.Deserialize<Root>(json);
    

    访问name

    var name = data.key2.items["123"].name
    

    Try it online

    注意,我给类命名很快……请考虑给类起更好的名称,更具描述性的名称。

    【讨论】:

      【解决方案2】:

      类似:

      public class Rootobject
      {
          public string key1 { get; set; }
          public InnerObject key2 { get; set; }
      }
      
      public class InnerObject 
      {
          public Dictionary<string, ObjectTheThird> items { get; set; }
              = new Dictionary<string, ObjectTheThird>();
      }
      
      public class ObjectTheThird
      {
          public int pageid { get; set; }
          public string name { get; set; }
      }
      

      并使用Dictionary&lt;,&gt; 上的 API 查看项目。或者你只想要第一个:

      var name = obj.key2.items.First().Value.name;
      

      【讨论】:

      • System.Text.Json 不会填充 items 字典,除非该属性具有公共 setter 和 getter。 (在 .NET 5 中,如果属性标记为 [JsonInclude],则 setter 可以是私有的)。请参阅dotnetfiddle.net/AMq4acdotnetfiddle.net/6PIuSG
      猜你喜欢
      • 2020-03-24
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 2021-04-19
      相关资源
      最近更新 更多