C# (.NET) 中的 JSON 处理:完整指南

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

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

开始课程

C# (.NET) 中的 JSON 处理:完整指南

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,广泛应用于 Web 应用程序、API 和配置文件中。在 C# (.NET) 生态系统中,处理 JSON 主要有两种方法:经典的 Newtonsoft.Json 库(也称为 Json.NET)和现代的内置库 System.Text.Json(自 .NET Core 3.0 起引入)。本文将详细讲解这两种工具、它们的功能、语法和最佳实践。



1. Newtonsoft.Json (Json.NET)

Newtonsoft.Json 库长期以来一直是 C# 中处理 JSON 的事实标准。它提供了丰富的 API、对 LINQ to JSON 的支持、灵活的序列化和反序列化配置。可以通过 NuGet 安装:

Install-Package Newtonsoft.Json


1.1. 序列化和反序列化

最基本的操作是将对象转换为 JSON 以及反向转换。考虑以下 Person 类:

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


序列化(对象 → JSON):

var person = new Person { Name = "伊万", Age = 30, Email = "ivan@example.com" };string json = JsonConvert.SerializeObject(person, Formatting.Indented);Console.WriteLine(json);


反序列化(JSON → 对象):

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


1.2. 使用 JObject 和 JArray

Newtonsoft.Json 库支持 LINQ to JSON,允许动态访问 JSON 元素,而无需创建强类型类。

string json = @"{""products"":[{""id"":1,""name"":""笔记本电脑""},{""id"":2,""name"":""鼠标""}]}";JObject obj = JObject.Parse(json);JArray products = (JArray)obj["products"];

foreach (var product in products){ int id = (int)product["id"]; string name = (string)product["name"]; Console.WriteLine($"ID: {id}, Name: {name}");}


1.3. 用于配置序列化的属性

通过属性,可以控制 JSON 中的属性名称、忽略字段、设置默认值等。

public class User{    [JsonProperty("user_name")]    public string Name { get; set; }

[JsonIgnore] public string Password { get; set; }

[JsonProperty("registration_date")] public DateTime CreatedAt { get; set; }}

// 序列化时,Password 将被忽略,Name 将变为 "user_name"string json = JsonConvert.SerializeObject(user);


2. System.Text.Json(.NET 内置库)

从 .NET Core 3.0 开始,微软推出了自己的 System.Text.Json 库,针对性能和最小内存消耗进行了优化。它不需要安装额外的包(某些扩展除外)。



2.1. 序列化和反序列化

使用 System.Text.Json 与 Newtonsoft.Json 类似,但在语法和默认行为(例如区分大小写)上存在一些差异。

using System.Text.Json;

var person = new Person { Name = "阿列克谢", Age = 28, Email = "alex@example.com" };string json = JsonSerializer.Serialize(person, new JsonSerializerOptions { WriteIndented = true });Console.WriteLine(json);

// 反序列化string jsonInput = @"{""Name"":""奥尔加"",""Age"":32,""Email"":""olga@example.com""}";Person deserializedPerson = JsonSerializer.Deserialize<Person>(jsonInput);


重要提示! 默认情况下,System.Text.Json 对

推荐