截至2021年11月,.NET 6
引入了System.Text.Json.Nodes命名空间,其中:
提供用于处理可写入内存的文档对象模型(DOM)的类型,
以便在结构化数据视图中随机访问JSON元素。
这四个新类型是JsonArray
、JsonObject
、JsonNode
和JsonValue
。
与JObject
最接近的类型是JsonObject
,它提供类似的功能。
以下是一些示例:
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"
}
}
};
int id = (int)obj["Id"];
DateTime dob = (DateTime)obj["DOB"];
string firstFriendName = (string)obj["Friends"][0]["Name"];
以下是一些其他酷炫的东西,这些东西使得在.NET6
中使用System.Text.Json
变得更加容易。
解析、创建和DOM操作
// parse
var jsonObj = JsonNode.Parse(jsonString).AsObject()
如果您有一个JsonElement(可能是在反序列化为dynamic、object或JsonElement后),您可以调用Create,现在您拥有了一个可导航和可写的DOM对象:
// create
JsonObject obj = JsonObject.Create(jsonElement);
您可以添加/删除属性:
obj.Add("FullName", "Bob Smith");
bool successfullyRemoved = obj.Remove("Name");
使用ContainsKey
和TryGetPropertyValue
(返回一个JsonNode
)来安全地查询对象是否包含特定的键:
if (obj.ContainsKey("Hobbies"))
// do stuff
if (obj.TryGetPropertyValue("Hobbies", out JsonNode? node))
// do stuff with node
项目和过滤数据
使用 Linq 可以对 JsonObject
进行项目投影和过滤。
List<string> keys = obj.Select(node => node.Key).ToList();
var friends = obj["Friends"].AsArray()
.Where(n => (int)n.AsObject()["Id"] > 2);
反序列化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;}
}