
在现代应用开发中,JSON(JavaScript Object Notation)已成为数据交换的主流格式之一。无论是前后端通信,还是与第三方 API 的交互,JSON 格式的灵活性和可读性都使它在众多场景中大放异彩。在 .NET 生态中,System.Text.Json 是一个轻量级、高性能的库,用于序列化和反序列化 JSON 数据。在 .NET 6 中,该库进一步增强,特别是其 JSON DOM(文档对象模型)API,提供了更加灵活和高效的方式操作 JSON 数据。
本文将详细讲解如何利用 .NET 6 的 JSON DOM API 处理 JSON 数据,从基本的读写操作到高级的动态操作和性能优化。
JSON DOM API 是 System.Text.Json 提供的一组类,用于将 JSON 文档解析为可操作的 DOM 树。这种方式使开发者可以动态地读取、修改和写回 JSON 数据,而不需要将其绑定到强类型对象。主要涉及以下核心类:
JsonDocument:只读表示 JSON 文档,适合用于解析和读取 JSON 数据。JsonElement:表示 JSON 数据的单个元素,可以是对象、数组、值等。JsonNode:新增于 .NET 6,用于动态读写 JSON 数据。它是一个抽象类,有三个具体实现:JsonObject:表示 JSON 对象。JsonArray:表示 JSON 数组。JsonValue:表示简单值类型(如字符串、数字、布尔值等)。JSON DOM API 的设计目标是性能优先,同时提供动态操作的灵活性。
使用 JSON DOM API 的场景主要包括:
System.Text.Json 的性能表现更优,占用更少的内存。以下是一个解析 JSON 数据并读取内容的示例:
using System;
using System.Text.Json;
class Program
{
static void Main()
{
string jsonString = @"
{
""name"": ""John Doe"",
""age"": 30,
""skills"": [""C#"", "".NET"", ""System.Text.Json""]
}";
using JsonDocument document = JsonDocument.Parse(jsonString);
JsonElement root = document.RootElement;
// 读取根元素的属性
string name = root.GetProperty("name").GetString();
int age = root.GetProperty("age").GetInt32();
// 遍历数组
JsonElement skills = root.GetProperty("skills");
foreach (JsonElement skill in skills.EnumerateArray())
{
Console.WriteLine(skill.GetString());
}
Console.WriteLine($"Name: {name}, Age: {age}");
}
}输出结果:
C#
.NET
System.Text.Json
Name: John Doe, Age: 30JsonDocument.Parse:将 JSON 字符串解析为 JsonDocument,这是一个只读表示,不支持修改。JsonElement:RootElement 表示 JSON 的根对象,可通过 GetProperty 方法访问属性。EnumerateArray 遍历数组元素。如果需要修改 JSON 数据,可以使用 JsonNode。它支持动态增删改查,并能轻松序列化回字符串。
using System;
using System.Text.Json;
using System.Text.Json.Nodes;
class Program
{
static void Main()
{
// 动态创建 JSON
var jsonObject = new JsonObject
{
["name"] = "Jane Doe",
["age"] = 28,
["skills"] = new JsonArray("C#", "ASP.NET", "System.Text.Json")
};
// 修改 JSON 数据
jsonObject["age"] = 29; // 更新年龄
((JsonArray)jsonObject["skills"]).Add("Azure"); // 添加新技能
// 打印结果
string updatedJson = jsonObject.ToJsonString(new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine(updatedJson);
}
}输出结果:
{
"name": "Jane Doe",
"age": 29,
"skills": [
"C#",
"ASP.NET",
"System.Text.Json",
"Azure"
]
}JsonObject 和 JsonArray 的构造函数非常直观,支持链式初始化。ToJsonString 方法将节点重新序列化为 JSON 字符串。对于嵌套结构较深或需要动态处理的大型 JSON 文档,可以结合 JsonNode 和 LINQ。
using System;
using System.Text.Json;
using System.Text.Json.Nodes;
class Program
{
static void Main()
{
string jsonString = @"
{
""employees"": [
{ ""id"": 1, ""name"": ""Alice"", ""department"": ""Engineering"" },
{ ""id"": 2, ""name"": ""Bob"", ""department"": ""HR"" },
{ ""id"": 3, ""name"": ""Charlie"", ""department"": ""Engineering"" }
]
}";
var root = JsonNode.Parse(jsonString);
var employees = root?["employees"]?.AsArray();
if (employees != null)
{
// 筛选出工程部员工
foreach (var employee in employees)
{
if (employee?["department"]?.GetValue<string>() == "Engineering")
{
Console.WriteLine(employee?["name"]?.GetValue<string>());
}
}
}
}
}输出结果:
Alice
CharlieParse。JsonDocumentOptions 控制内存池分配。JsonNode 动态操作方便,但 JsonDocument 在只读场景中更高效。功能 | System.Text.Json | Newtonsoft.Json |
|---|---|---|
性能 | 高 | 较低 |
动态操作 | 支持(JsonNode) | 支持(JObject/JArray) |
特性支持 | 支持部分(如 JsonIgnore) | 更全面 |
跨平台支持 | 优秀 | 优秀 |
System.Text.Json 是现代 .NET 应用的首选,特别是在性能敏感的场景中。
.NET 6 的 JSON DOM API 提供了一种灵活、高效的方式操作 JSON 数据。从基础的只读操作到动态的增删改,System.Text.Json 的功能覆盖了广泛的应用场景。通过合理选择和优化,可以充分发挥其性能优势,使你的应用在处理 JSON 数据时更加得心应手。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。