使用 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<,>
上的 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