在 C# 中处理 JSON:面向初学者的解析与序列化

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 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.

博客

书籍推荐