ASP.NET 中处理 JSON 的全面指南:序列化与反序列化
在现代 Web 开发中,JSON(JavaScript Object Notation)因其轻量级、易读易写以及与 JavaScript 的天然亲和力,已成为数据交换的事实标准,在 ASP.NET 应用程序中,无论是构建 Web API、前后端分离的应用,还是处理第三方服务的数据交互,都不可避免地需要处理 JSON 数据,本文将详细介绍在 ASP.NET(以广泛使用的 ASP.NET Core 和传统 ASP.NET Web API 为例)中如何进行 JSON 的序列化(将对象转换为 JSON 字符串)和反序列化(将 JSON 字符串转换为对象)。
什么是序列化与反序列化?
- 序列化 (Serialization):将 .NET 对象(如自定义类、集合等)转换为 JSON 格式的字符串,以便在网络中传输或存储到文本文件中。
- 反序列化 (Deserialization):将 JSON 格式的字符串转换回 .NET 对象,以便在应用程序中操作和使用这些数据。
ASP.NET Core 中处理 JSON
ASP.NET Core 内置了对 JSON 的强大支持,主要依赖于 System.Text.Json 命名空间中的类(这是 .NET Core 3.0 及以上版本的默认选择),同时也支持使用流行的第三方库 Newtonsoft.Json(俗称 Json.NET)。
使用 System.Text.Json (推荐)
System.Text.Json 是 .NET Core 3.0+ 引入的高性能 JSON 库,具有较低的内存占用和较好的吞吐量。
a) 序列化对象为 JSON 字符串
using System;
using System.Text.Json;
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public DateTime CreatedAt { get; set; }
}
public class Program
{
public static void Main()
{
var user = new User
{
Id = 1,
Name = "张三",
Email = "zhangsan@example.com",
CreatedAt = DateTime.UtcNow
};
// 序列化选项:可配置 camelCase、忽略 null 值等
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // 属性名转为 camelCase 风格 (如 Name -> name)
WriteIndented = true // 美化输出,缩进
};
string jsonString = JsonSerializer.Serialize(user, options);
Console.WriteLine(jsonString);
// 输出类似:
// {
// "id": 1,
// "name": "张三",
// "email": "zhangsan@example.com",
// "createdAt": "2023-10-27T08:30:45.1234567Z"
// }
}
}
b) 反序列化 JSON 字符串为对象
using System;
using System.Text.Json;
public class Program
{
public static void Main()
{
string jsonString = @"{
""id"": 2,
""name"": ""李四"",
""email"": ""lisi@example.com"",
""createdAt"": ""2023-10-27T09:00:00Z""
}";
var options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true // 属性名不敏感,可匹配 JSON 中的 camelCase 或 PascalCase
};
User user = JsonSerializer.Deserialize<User>(jsonString, options);
if (user != null)
{
Console.WriteLine($"用户ID: {user.Id}, 姓名: {user.Name}, 邮箱: {user.Email}");
// 输出:用户ID: 2, 姓名: 李四, 邮箱: lisi@example.com
}
}
}
c) 在 ASP.NET Core Web API 中的自动处理
ASP.NET Core Web API 默认使用 System.Text.Json 进行请求和响应的序列化/反序列化。
- 控制器 Action 返回对象:API 会自动将返回的对象序列化为 JSON 响应。
[ApiController] [Route("api/[controller]")] public class UsersController : ControllerBase { [HttpGet("{id}")] public IActionResult GetUser(int id) { var user = new User { Id = id, Name = "示例用户", Email = "user@example.com" }; return Ok(user); // 自动序列化为 JSON } } - 接收 JSON 请求体:Action 参数上标记
[FromBody],模型绑定器会自动将请求体中的 JSON 反序列化为对象。[HttpPost] public IActionResult CreateUser([FromBody] User user) { if (user == null) { return BadRequest(); } // 处理 user 对象... return CreatedAtAction(nameof(GetUser), new { id = user.Id }, user); }
使用 Newtonsoft.Json (Json.NET)
如果你习惯使用 Json.NET,或者项目依赖于它的某些高级特性,可以轻松集成。
a) 安装 NuGet 包
Install-Package Newtonsoft.Json
b) 序列化
using Newtonsoft.Json;
var user = new User { Id = 3, Name = "王五", Email = "wangwu@example.com" };
string jsonString = JsonConvert.SerializeObject(user, Formatting.Indented);
Console.WriteLine(jsonString);
c) 反序列化
string json = @"{""id"":4,""name"":""赵六"",""email"":""zhaoliu@example.com""}";
User deserializedUser = JsonConvert.DeserializeObject<User>(json);
Console.WriteLine($"用户ID: {deserializedUser.Id}, 姓名: {deserializedUser.Name}");
d) 在 ASP.NET Core Web API 中使用 Newtonsoft.Json
如果你希望将 ASP.NET Core Web API 的默认 JSON 序列化器替换为 Newtonsoft.Json:
- 安装
Microsoft.AspNetCore.Mvc.NewtonsoftJsonNuGet 包。 - 在
Program.cs(或Startup.cs的ConfigureServices方法中) 注册服务:
// Program.cs
builder.Services.AddControllers()
.AddNewtonsoftJson(); // 替换默认的 System.Text.Json 为 Newtonsoft.Json
传统 ASP.NET Web API 中处理 JSON
在传统的 ASP.NET Web API (基于 .NET Framework) 中,默认使用的是 Newtonsoft.Json。
a) 序列化
using Newtonsoft.Json;
var user = new User { Id = 5, Name = "传统用户", Email = "legacy@example.com" };
string jsonString = JsonConvert.SerializeObject(user);
b) 反序列化
string json = @"{""id"":6,""name"":""传统用户二""}";
User user = JsonConvert.DeserializeObject<User>(json);
c) Web API 控制器中的使用
与传统 ASP.NET Web API 配合使用时,通常不需要额外配置,它会自动处理 JSON 的序列化和反序列化,方式与 ASP.NET Core 中使用 Newtonsoft.Json 类似。
public class LegacyUsersController : ApiController
{
public IHttpActionResult GetUser(int id)
{
var user = new User { Id = id, Name = "传统API用户" };
return Json(user); // 直接返回 JsonResult
// 或者 return Ok(user); // 默认也会序列化为 JSON
}
[HttpPost]
public IHttpActionResult CreateUser(User user) // [FromBody] 可选,但推荐
{
// 处理 user
return CreatedRequest("GetUser", new { id = user.Id }, user);
}
}
常见问题与注意事项
-
循环引用:当对象之间存在循环引用时,序列化会抛出异常(
System.Text.Json会直接报错,Newtonsoft.Json默认也会报错),解决方法:- 在序列化选项中忽略循环引用:
System.Text.Json:ReferenceHandler = ReferenceHandler.IgnoreCyclesNewtonsoft.Json:ReferenceLoopHandling = ReferenceLoopHandling.Ignore
- 重新设计数据模型,避免循环引用。
- 在序列化选项中忽略循环引用:
-
日期时间格式:默认情况下,日期时间会序列化为 ISO 8601 格式,可以根据需要自定义格式,例如使用
yyyy-MM-dd HH:mm:ss。 -
大小写敏感:默认情况下,JSON 属性名和 .NET 属性名是区分大小写的,可以通过配置
PropertyNameCaseInsensitive = true(反序列化时) 或PropertyNamingPolicy(序列化时) 来处理。 -
空值处理:可以配置在序列化时忽略值为
null的属性。 -
复杂类型与集合:
System.Text.Json和Newtonsoft.Json都能很好地处理复杂对象和集合(如 List, Array, Dictionary 等)。
在 ASP.NET 中处理 JSON 数据是一项基础且重要的技能,无论是选择高性能的 System.Text.Json(ASP.NET Core �



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