C# 中的 JSON 操作:实战解析与序列化

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

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

开始课程

引言

JSON(JavaScript 对象表示法)是一种轻量级的数据交换格式,已成为服务器与客户端之间交互以及存储配置的事实标准。在 C# (.NET) 生态系统中,JSON 操作得到了最高级别的支持:开发者既可以使用内置库,也可以使用强大的第三方解决方案。在本文中,我们将通过实际示例,讲解如何使用现代方法在 C# 中执行 JSON 的解析、序列化和反序列化。

我们将介绍两个主要工具:System.Text.Json(自 .NET Core 3.0+ 起的内置库)和 Newtonsoft.Json(流行的第三方库)。您将学习如何将 C# 对象转换为 JSON 以及反向转换,如何处理嵌套结构,以及如何处理错误。



C# 中序列化与反序列化的基础

在深入代码之前,我们先明确术语。序列化是将 C# 对象(例如类的实例)转换为 JSON 字符串的过程。反序列化是反向过程:从 JSON 字符串中恢复 C# 对象。在 C# 中,这通过属性和专门的序列化器类来实现。



1. 使用 System.Text.Json(内置库)

从 .NET Core 3.0 开始,微软推出了自己的 JSON 操作库——System.Text.Json。它比 Newtonsoft.Json 更快,并且无需安装额外的包。

考虑一个简单的 Person 类:

public class Person{    public string Name { get; set; }    public int Age { get; set; }    public string Email { get; set; }}

序列化为 JSON:

using System.Text.Json;

var person = new Person{ Name = "阿列克谢", Age = 30, Email = "alex@example.com"};

string json = JsonSerializer.Serialize(person);Console.WriteLine(json);// 输出:{"Name":"阿列克谢","Age":30,"Email":"alex@example.com"}

从 JSON 反序列化:

string jsonString = @"{""Name"":""玛丽亚"",""Age"":25,""Email"":""maria@example.com""}";Person? person = JsonSerializer.Deserialize<Person>(jsonString);Console.WriteLine(person?.Name); // 玛丽亚

请注意 ?(可为空)运算符——反序列化在出错时可能返回 null。



2. 使用 Newtonsoft.Json (Json.NET)

尽管 System.Text.Json 已经出现,Newtonsoft.Json 因其灵活性和广泛的配置能力仍然是热门选择。要使用它,请安装 NuGet 包 Newtonsoft.Json。

使用相同的 Person 类示例:

using Newtonsoft.Json;

// 序列化var person = new Person { Name = "伊万", Age = 35, Email = "ivan@example.com" };string json = JsonConvert.SerializeObject(person);Console.WriteLine(json);

// 反序列化string jsonInput = @"{'Name':'奥尔加','Age':28,'Email':'olga@example.com'}";Person? personDeserialized = JsonConvert.DeserializeObject<Person>(jsonInput);Console.WriteLine(personDeserialized?.Name); // 奥尔加

Newtonsoft.Json 默认支持双引号和单引号,使其对“脏” JSON 更加宽容。



进阶场景:处理嵌套对象和集合

在实际项目中,JSON 很少是扁平的。我们来看一个包含嵌套数据的示例。

假设我们有一个 Company 类,其中包含一个员工列表:

public class Employee{    public string Name { get; set; }    public string Position { get; set; }}

public class Company{ public string CompanyName { get; set; } public List<Employee> Employees { get; set; }}

序列化(System.Text.Json):



                
                

博客

书籍推荐