使用 System.Text.Json 使用动态键查询或反序列化 json

Posted

技术标签:

【中文标题】使用 System.Text.Json 使用动态键查询或反序列化 json【英文标题】:Query or deserialize json with dynamic keys using System.Text.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。

【问题讨论】:

【参考方案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/AMq4ac 与 dotnetfiddle.net/6PIuSG

以上是关于使用 System.Text.Json 使用动态键查询或反序列化 json的主要内容,如果未能解决你的问题,请参考以下文章

将 false 反序列化为 null (System.Text.Json)

。NET Core 3.1-Ajax OnGet和使用NEW System.Text.Json返回对象

使用 System.Text.Json 从 json 文件读取到 IEnumerable

如何使用 System.Text.Json 忽略错误值

使用 System.Text.Json 修改 JSON 文件

如何在反序列化之前使用 System.Text.Json 验证 JSON