.NET 中高效处理 JSON 数据:从基础到实践**
JSON(JavaScript Object Notation)作为一种轻量级、易读易写的数据交换格式,在现代软件开发中得到了广泛应用,特别是在 Web 服务、API 交互、配置文件等领域。.NET 框架对 JSON 的支持非常完善,提供了多种方式来处理 JSON 数据,本文将详细介绍在 .NET 中如何使用 JSON 数据,包括序列化与反序列化的核心概念、常用库的使用、以及实际场景下的代码示例。
JSON 与 .NET 的邂逅:为什么选择 JSON?
在 .NET 中处理 JSON 数据,主要源于以下需求:
- Web API 通信:绝大多数现代 Web API 都使用 JSON 作为数据交换格式。.NET 客户端(如 ASP.NET Core MVC 应用、控制台应用)需要能够发送和接收 JSON 请求/响应。
- 配置管理:.NET Core 及更高版本原生支持 JSON 格式的配置文件(如
appsettings.json),使得应用程序配置更加灵活和结构化。 - 数据持久化:JSON 文件可以作为简单的数据存储方式,用于保存应用程序状态、用户设置等。
- 跨平台数据交换:JSON 的通用性使其成为不同平台、不同语言间数据交换的理想选择。
核心概念:序列化与反序列化
在代码之前,必须理解两个核心概念:
- 序列化 (Serialization):将 .NET 对象(如自定义类、List、Dictionary 等)转换为 JSON 格式的字符串,这个过程便于数据存储或传输。
- 反序列化 (Deserialization):将 JSON 格式的字符串转换回 .NET 对象,这样程序就可以方便地操作和使用这些数据。
.NET 中处理 JSON 的主要方式
.NET 提供了多个内置和第三方库来处理 JSON,以下是几种最常用的方式:
System.Text.Json (推荐,.NET Core 3.0+ 及 .NET 5/6/7/8+ 内置)
这是微软官方推荐的新一代 JSON 库,性能优异,功能全面,且无需额外安装包(对于新项目)。
基本使用:
-
添加命名空间:
using System.Text.Json; using System.Text.Json.Serialization;
-
定义模型类:
public class User { [JsonPropertyName("id")] // 可选:指定 JSON 属性名 public int Id { get; set; } [JsonPropertyName("name")] public string Name { get; set; } [JsonPropertyName("email")] public string Email { get; set; } [JsonPropertyName("is_active")] public bool IsActive { get; set; } = true; } -
序列化 (对象 -> JSON 字符串):
var user = new User { Id = 1, Name = "张三", Email = "zhangsan@example.com" }; string jsonString = JsonSerializer.Serialize(user); Console.WriteLine(jsonString); // 输出: {"id":1,"name":"张三","email":"zhangsan@example.com","is_active":true} // 格式化输出 (美化) string formattedJson = JsonSerializer.Serialize(user, new JsonSerializerOptions { WriteIndented = true }); Console.WriteLine(formattedJson); // 输出: // { // "id": 1, // "name": "张三", // "email": "zhangsan@example.com", // "is_active": true // } -
反序列化 (JSON 字符串 -> 对象):
string json = @"{ ""id"": 2, ""name"": ""李四"", ""email"": ""lisi@example.com"", ""is_active"": false }"; var deserializedUser = JsonSerializer.Deserialize<User>(json); if (deserializedUser != null) { Console.WriteLine($"ID: {deserializedUser.Id}, Name: {deserializedUser.Name}, Email: {deserializedUser.Email}, Active: {deserializedUser.IsActive}"); } // 输出: ID: 2, Name: 李四, Email: lisi@example.com, Active: False -
处理集合(List, Array):
string usersJson = @"[ {""id"":1,""name"":""张三"",""email"":""zhangsan@example.com""}, {""id"":2,""name"":""李四"",""email"":""lisi@example.com""} ]"; var userList = JsonSerializer.Deserialize<List<User>>(usersJson); foreach (var u in userList) { Console.WriteLine(u.Name); } -
配置选项:
JsonSerializerOptions允许你自定义序列化/反序列化行为,如忽略 null 值、自定义日期格式、大小写敏感等。
Newtonsoft.Json (经典,.NET Framework 及 .NET Core 中广泛使用)
虽然 System.Text.Json 是新推荐,但 Newtonsoft.Json(常被称为 Json.NET)因其悠久的历史、丰富的功能和强大的社区支持,仍然被大量项目使用,在 .NET Core 项目中,通常需要通过 NuGet 包管理器安装。
安装 NuGet 包:
Install-Package Newtonsoft.Json
基本使用:
-
添加命名空间:
using Newtonsoft.Json;
-
序列化:
var user = new User { Id = 1, Name = "张三", Email = "zhangsan@example.com" }; string jsonString = JsonConvert.SerializeObject(user); Console.WriteLine(jsonString); // 输出: {"id":1,"name":"张三","email":"zhangsan@example.com","is_active":true} // 格式化输出 string formattedJson = JsonConvert.SerializeObject(user, Formatting.Indented); Console.WriteLine(formattedJson); -
反序列化:
string json = @"{ ""id"": 2, ""name"": ""李四"", ""email"": ""lisi@example.com"", ""is_active"": false }"; var deserializedUser = JsonConvert.DeserializeObject<User>(json); if (deserializedUser != null) { Console.WriteLine($"ID: {deserializedUser.Id}, Name: {deserializedUser.Name}, Email: {deserializedUser.Email}, Active: {deserializedUser.IsActive}"); } -
处理集合:
string usersJson = @"[ {""id"":1,""name"":""张三"",""email"":""zhangsan@example.com""}, {""id"":2,""name"":""李四"",""email"":""lisi@example.com""} ]"; var userList = JsonConvert.DeserializeObject<List<User>>(usersJson); -
特性:Newtonsoft.Json 提供了丰富的特性,如
[JsonProperty]、[JsonIgnore]、[JsonConverter]等,用于精确控制 JSON 与 .NET 对象之间的映射。
System.Text.Json 与 Newtonsoft.Json 的选择
- 优先选择
System.Text.Json:- 新项目,特别是基于 .NET Core 3.0+ / .NET 5/6/7/8+ 的项目。
- 追求更高性能和更小的内存占用。
- 无需额外依赖(内置库)。
- 继续使用
Newtonsoft.Json:- 现有项目已广泛使用,迁移成本高。
- 需要
Newtonsoft.Json提供的某些高级特性或自定义功能,而System.Text.Json暂不支持或支持不够完善。 - 依赖第三方库强制要求使用
Newtonsoft.Json。
使用 JsonSerializer 进行流式处理(适用于大文件)
对于非常大的 JSON 数据,一次性加载到内存可能会导致性能问题。System.Text.Json 和 Newtonsoft.Json 都支持流式处理(读写流),从而减少内存占用。
示例 (System.Text.Json):
using System.Text.Json;
using System.IO;
// 假设有一个很大的 JSON 文件 "largefile.json"
using (var fileStream = File.OpenRead("largefile.json"))
using (var streamReader = new StreamReader(fileStream))
using (var jsonReader = new Utf8JsonReader(streamReader.BaseStream))
{
while (jsonReader.Read())
{
if (jsonReader.TokenType == JsonTokenType.StartObject)
{
// 可以在这里逐个处理 JSON 对象
// 反序列化为单个 User 对象
var user = JsonSerializer.Deserialize<User>(ref jsonReader);
// 处理 user...
}
}
}



还没有评论,来说两句吧...