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.Json1.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 对