在 C# 中处理 JSON 简介
JSON(JavaScript 对象表示法)是一种轻量级的数据交换格式,广泛应用于 Web 开发、配置文件和 API。如果你刚开始学习 C# 和 .NET,掌握 JSON 处理是一项必备技能。在本文中,我们将讲解如何使用 .NET 内置工具和流行的 Newtonsoft.Json 库执行 JSON 解析(将字符串转换为对象)和 序列化(将对象转换为 JSON 字符串)。
我们将通过实际示例帮助你快速掌握关键概念。所有代码均使用 C# (.NET 6+) 编写,但只需稍作修改即可在更早版本中运行。
1. 内置 JSON 处理:System.Text.Json 命名空间
从 .NET Core 3.0 开始,微软引入了高性能的 System.Text.Json 命名空间。它内置于平台中,无需安装额外的包。这是现代 .NET 应用程序中处理 JSON 的主要工具。
1.1 将对象序列化为 JSON
序列化是将 C# 对象转换为 JSON 字符串的过程。考虑一个简单的 Person 类:
public class Person{ public string Name { get; set; } public int Age { get; set; } public string Email { get; set; }}
// 使用var person = new Person{ Name = "伊万·伊万诺夫", Age = 30, Email = "ivan@example.com"};
string json = System.Text.Json.JsonSerializer.Serialize(person);Console.WriteLine(json);执行结果:
{"Name":"伊万·伊万诺夫","Age":30,"Email":"ivan@example.com"}默认情况下,属性使用与 C# 中相同的名称进行序列化。你可以通过 JsonSerializerOptions 自定义格式,例如使 JSON 更易读:
var options = new System.Text.Json.JsonSerializerOptions{ WriteIndented = true};
string prettyJson = JsonSerializer.Serialize(person, options);Console.WriteLine(prettyJson);现在输出将带有缩进:
{ "Name": "伊万·伊万诺夫", "Age": 30, "Email": "ivan@example.com"}1.2 将 JSON 反序列化(解析)为对象
反向过程——将 JSON 字符串转换为 C# 对象——称为反序列化。使用 JsonSerializer.Deserialize<T>() 方法:
string jsonString = @"{""Name"":""玛丽亚·彼得罗娃"",""Age"":25,""Email"":""maria@example.com""}";
Person? person = System.Text.Json.JsonSerializer.Deserialize<Person>(jsonString);
if (person != null){ Console.WriteLine($"姓名: {person.Name}, 年龄: {person.Age}");}重要提示:如果 JSON 与类结构不匹配,将抛出 JsonException 异常。为了安全操作,请使用异常处理或检查 null。
1.3 使用 JsonDocument 处理任意 JSON
有时 JSON 结构事先未知,或者你希望在不创建类的情况下读取数据。此时可以使用 JsonDocument:
string jsonText = @"{""product"":""笔记本电脑"",""price"":75000,""inStock"":true}";
using JsonDocument doc = JsonDocument.Parse(jsonText);JsonElement root = doc.RootElement;
string product = root.GetProperty("product").GetString();int price = root.GetProperty("price").GetInt32();bool inStock = root.GetProperty("inStock").GetBoolean();
Console.WriteLine($"{product}: {price} 卢布 (有货: {inStock})");JsonDocument 实现了 IDisposable,因此务必使用 using 来释放资源。
2. 经典库 Newtonsoft.Json (Json.NET)
在 System.Text.