截至 2021 年 11 月,.NET 6 引入了 System.Text.Json.Nodes 命名空间,其中:
提供用于处理内存中可写文档对象的类型
模型 (DOM) 用于随机访问结构化文件中的 JSON 元素
数据视图
四种新类型是JsonArray、JsonObject、JsonNode和JsonValue。
与JObject 最接近的类型是JsonObject,它提供了类似的功能。
请参阅下面的一些示例:
// create object manually using initializer syntax
JsonObject obj = new JsonObject
{
["Id"] = 3,
["Name"] = "Bob",
["DOB"] = new DateTime(2001, 02, 03),
["Friends"] = new JsonArray
{
new JsonObject
{
["Id"] = 2,
["Name"] = "Smith"
},
new JsonObject
{
["Id"] = 4,
["Name"] = "Jones"
}
}
};
// random access to values
int id = (int)obj["Id"];
DateTime dob = (DateTime)obj["DOB"];
string firstFriendName = (string)obj["Friends"][0]["Name"];
下面列出了现在在.NET6 中使用System.Text.Json 变得更加容易的其他一些很酷的东西。
解析、创建和 DOM 操作
// parse
JsonObject jsonObj = JsonObject.Parse(jsonString);
如果你有一个JsonElement(也许在反序列化为dynamic、object或JsonElement之后)你可以调用Create,现在你有一个可导航和可写的DOM对象:
// create
JsonObject obj = JsonObject.Create(jsonElement);
您可以添加/删除属性:
obj.Add("FullName", "Bob Smith");
bool successfullyRemoved = obj.Remove("Name");
使用返回JsonNode的ContainsKey和TryGetPropertyValue安全地询问特定键的对象:
if (obj.ContainsKey("Hobbies"))
// do stuff
if (obj.TryGetPropertyValue("Hobbies", out JsonNode? node))
// do stuff
项目和过滤数据
可以使用 Linq 对JsonObject 进行投影和过滤:
// select Keys
List<string> keys = obj.Select(node => node.Key).ToList();
// filter friends
var friends = obj["Friends"].AsArray()
.Where(n => n.AsObject().ContainsKey("Id") && (int)n.AsObject()["Id"] > 2);
反序列化 Json
现在可以轻松反序列化 Json 或反序列化 Json 的一部分。当我们只想从主对象反序列化部分 Json 时,这很有用。对于上面的示例,我们可以轻松地将朋友列表反序列化为通用 List<Friend>:
List<Friend> friends = obj["Friends"].AsArray().Deserialize<List<Friend>>();
其中Deserilize<T>() 是JsonNode 上的扩展方法。
序列化
使用ToJsonString()序列化JsonObject很容易:
string s = obj.ToJsonString();
// write pretty json with WriteIndented
string s = obj.ToJsonString(new JsonSerializerOptions { WriteIndented = true }));
在您的特定情况下,您可以在 DTO 中定义 JsonObject:
public class MyDTO
{
public JsonObject ExtractedData {get;set;}
}