处理 JSON 数据是许多开发人员的日常任务,因为它在现代应用程序中广泛使用。随着.NET的System.Text.Json库,使用JSON从未像现在这样高效或直接。在本指南中,我们将介绍此库的基本要素,确保您拥有轻松管理 JSON 数据的工具和知识。无论你是 JSON 的新手,还是只是想提高自己的技能,让我们深入了解一下 .NET 带来了什么!
.NET 中的 System.Text.Json 命名空间为开发人员提供了为各种 JSON 操作(无论是创建、更新、删除还是遍历)量身定制的强大类。通过对 JsonValue、JsonObject、JsonArray、JsonDocument 和 JsonNode 的理解,在 .NET 中操作 JSON 从未像现在这样直观和高效。
JsonValue 表示 JSON 中的原子元素,迎合基本数据类型:数字、字符串、布尔值和 null。通过简单的实例化,您可以在 JSON 范式中封装字符串。但真正的美在于它的类型安全性。隐式转换是基石,允许以本机 .NET 格式检索值。虽然 JsonValue 在个人价值方面大放异彩,但请记住,它不是为复杂结构而设计的——这就是我们的下一个原语发挥作用的地方。
JsonValue number = JsonValue.Create(123);
JsonValue text = JsonValue.Create("Hello World");
JsonValue flag = JsonValue.Create(false);
定义
表示简单的 JSON 值:数字、字符串、布尔值或 null。
最佳实践
陷阱
想象一下,需要 JSON 中的键值对集合。这正是 JsonObject 的领域。它不仅仅是一个静态的表示;即使在创建对象之后,您也可以动态添加、删除或更改这些对。
JsonObject employee = new JsonObject
{
["firstName"] = JsonValue.Create("John"),
["lastName"] = JsonValue.Create("Doe"),
["isManager"] = JsonValue.Create(false)
};
要更新,只需重新分配一个值:
employee["isManager"] = true;
可以使用 Remove 方法删除属性:
employee.Remove("isManager");
定义
封装 JSON 对象 — 键值对。ContainsKey 和 TryGetValue 方法进一步增强了安全性,确保密钥在任何检索尝试之前存在。但是,对于纯只读任务,JsonObject 可能有点矫枉过正。
最佳实践
陷阱
性能基准
JSON 中的列表或序列由 JsonArray 封装。可以把它想象成一个专用于JSON的动态列表,能够进行多种操作。
JsonArray colors = new JsonArray { "red", "green", "blue" };
添加和删除操作简单:
colors.Add("black");
colors.Remove("red");
定义
表示顺序 JSON 数组。但是,确保这些数组中的类型一致性至关重要。虽然它们擅长于类似列表的结构,但对于要求更高的性能方案,本机 .NET 集合可能是更好的选择。
最佳实践
陷阱
性能基准
当涉及到在不进行更改的情况下捕获 JSON 快照时,JsonDocument 脱颖而出。它是 JSON 内容的解析只读演绎版。内存效率值得注意,因为它在租用的缓冲区内运行,从而减少了分配。
using var doc = JsonDocument.Parse("{\"country\":\"Ukraine\",\"capital\":\"Kyiv\"}");
var capital = doc.RootElement.GetProperty("capital").GetString();
定义
已分析的 JSON 文档的只读表示形式。虽然它的只读特性确保了某些任务的峰值性能,但它本质上意味着结构是不可变的。如果需要修改,可能需要探索其他基元。
最佳实践
陷阱
性能基准
System.Text.Json 的抽象核心是 JsonNode,它是 JsonValue、JsonObject 和 JsonArray 等的基础。它提供了 JSON 结构中任何节点的统一表示。虽然开发人员很少直接与它交互,但了解它的基本作用可以揭示其衍生品的行为。从值到对象再到数组,每个衍生品都带来了量身定制的功能集,确保开发人员拥有适合正确工作的正确工具。
JsonNode node = new JsonObject();
node["name"] = "Doe";
要在复杂的 JSON 结构中查找特定节点或值,请执行以下操作:
if(node is JsonObject obj && obj.ContainsKey("name"))
{
Console.WriteLine($"Found name: {obj["name"\]}");
}
定义
JsonValue、JsonObject 和 JsonArray 的抽象基类。
最佳实践
陷阱
性能基准
默认情况下,每个 .NET 对象都提供一个 ToString() 方法。但是,在 JSON 的上下文中,它具有专门的功能。
JSON 节点上的 ToString() 方法提供当前值的字符串表示形式。对于字符串和数字等基元值,输出与预期一致。但是,对于更复杂的对象,输出将被格式化以提高可读性,并具有适当的缩进和换行符。
var simpleValue = JsonValue.Create("Alice");
Console.WriteLine(simpleValue.ToString());
// Output: Alice
var complexValue = new JsonObject
{
["id"] = 1,
["name"] = "Bob",
["tags"] = new JsonArray { "friend", "developer" }
};
Console.WriteLine(complexValue.ToString());
/* Output:
{
"id": 1,
"name": "Bob",
"tags": [
"friend",
"developer"
]
}
*/
如上所述,ToString() 方法可确保缩进更复杂的对象,从而提高人类的可读性。
ToString() 的目标是可读性,而 ToJsonString() 的目标是紧凑且有效的 JSON 输出。当您正在寻找可以通过网络传输或存储在数据库中的正确 JSON 表示形式时,可以使用这种方法。
var simpleValue = JsonValue.Create("Alice");
Console.WriteLine(simpleValue.ToJsonString());
// Output: "Alice"
var complexValue = new JsonObject
{
["id"] = 1,
["name"] = "Bob",
["tags"] = new JsonArray { "friend", "developer" }
};
Console.WriteLine(complexValue.ToJsonString());
// Output: {"id":1,"name":"Bob","tags":["friend","developer"]}
请注意,在 ToJsonString() 中,字符串值用双引号括起来,与 JSON 标准一致。对于复杂对象,消除了空格和换行符以产生紧凑的表示。
定制
除了基本转换之外,ToJsonString() 还允许使用 JsonSerializerOptions 进行自定义。当您需要修改序列化输出以满足某些要求(如驼峰外壳属性)时,这很方便。
var data = new JsonObject
{
["FirstName"] = "Charlie",
["LastName"] = "Brown"
};
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
Console.WriteLine(data.ToJsonString(options));
// Output: {"firstName":"Charlie","lastName":"Brown"}
在上面的示例中,JsonSerializerOptions 用于将属性名称更改为驼峰大小写。
System.Text.Json 已将自己确立为用于 .NET 中 JSON 操作的高性能和轻量级库。无论您是新手还是已经使用了一段时间,一些见解都可以优化您的使用并解决常见挑战。
var options = new JsonSerializerOptions
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
};
System.Text.Json 和 Newtonsoft.Json 是两个常用的库,用于在 .NET 中处理 JSON。两者都有其优点和缺点,这使得它们或多或少适合某些场景。
在 System.Text.Json 和 Newtonsoft.Json 之间进行选择应基于项目的特定需求。如果性能是主要关注点,并且 System.Text.Json 的功能集满足项目的要求,则它可能是更好的选择。另一方面,需要广泛功能、广泛自定义或对 Newtonsoft.Json 具有现有依赖关系的项目可能更合适。
System.Text.Json 提供了一套全面的工具,用于在 .NET 中进行 JSON 处理。通过了解每个类的细微差别和最合适的场景,开发人员可以编写高效、干净和高性能的代码来满足他们的所有 JSON 需求。