网站首页 > 文章精选 正文
在现代软件开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,被广泛应用于前后端交互、配置文件管理以及分布式系统间的数据传输。System.Text.Json 是 .NET Core 3.0 及更高版本中引入的高性能 JSON 处理库,提供了序列化和反序列化的功能,并且与 .NET 平台深度集成, 在 ASP.NET Core Web API 中是默认的 JSON 序列化和反序列化库,用于处理 HTTP 请求和响应中的 JSON 数据。
1. 配置System.Text.Json
在 ASP.NET Core 项目中,可以通过 Startup.cs 或 Program.cs 配置 System.Text.Json 的行为。以下是一些常见的配置选项:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddJsonOptions(options =>
{
// 配置 JSON 序列化选项
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; // 使用驼峰式命名
options.JsonSerializerOptions.WriteIndented = true; // 格式化输出
options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All); // 取消 Unicode 编码
options.JsonSerializerOptions.IgnoreNullValues = true; // 忽略空值
options.JsonSerializerOptions.AllowTrailingCommas = true; // 允许尾随逗号
options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; // 反序列化时不区分大小写
});
}
2. 序列化和反序列化
序列化
在控制器中返回对象时,System.Text.Json 会自动将其序列化为 JSON:
[HttpGet]
public IActionResult Get()
{
var user = new { Name = "张三", Age = 30 };
return Ok(user); // 自动序列化为 JSON
}
需要手动序列化,可以使用 JsonSerializer.Serialize:
var user = new { Name = "张三", Age = 30 };
string jsonString = JsonSerializer.Serialize(user);
return Ok(jsonString);
反序列化
在接收 JSON 数据时,System.Text.Json 会自动将其反序列化为对象。例如,通过 [FromBody] 接收请求体中的 JSON 数据:
[HttpPost]
public IActionResult Post([FromBody] User user)
{
return Ok(user);
}
需要手动反序列化,可以使用
JsonSerializer.Deserialize:
string jsonString = await new StreamReader(Request.Body).ReadToEndAsync();
var user = JsonSerializer.Deserialize<User>(jsonString);
return Ok(user);
3. 高级用法
自定义转换器
需要对特定类型进行自定义序列化或反序列化,可以实现 JsonConverter<T> 并注册到 JsonSerializerOptions 中:
public class CustomDateTimeConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateTime.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("yyyy-MM-dd"));
}
}
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new CustomDateTimeConverter());
});
使用JsonDocument和JsonNode
在某些场景下,可能需要动态处理 JSON 数据,而不是直接映射到实体类。可以使用 JsonDocument 或 JsonNode:
string jsonString = await new StreamReader(Request.Body).ReadToEndAsync();
using JsonDocument doc = JsonDocument.Parse(jsonString);
var name = doc.RootElement.GetProperty("Name").GetString();
return Ok(name);
或者使用 JsonNode:
JsonNode node = JsonNode.Parse(jsonString);
var name = node["Name"].GetValue<string>();
return Ok(name);
4. 全局配置
在 Web API 中,可以通过 JsonSerializerOptions 配置全局的 JSON 处理行为。例如,设置日期格式:
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
});
其中,DateTimeConverter 是自定义的日期格式转换器。
5. 性能优化
从 .NET 8 开始,System.Text.Json 支持源生成(Source Generation),可以在编译时生成优化的序列化和反序列化代码:
[JsonSerializable(typeof(User))]
[JsonSourceGenerationOptions(WriteIndented = true, PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase)]
public partial class JsonContext : JsonSerializerContext
{
}
dotnet 10 中新增的 JsonIgnoreCondition,可以比较方便地只处理属性的序列化和反序列化时忽略。不过Net10是预览版版本的,很期待上线,所以暂时不介绍。
6.特性
请参考:
https://mp.weixin.qq.com/s/N1ldYFwjZfscJ4_UW7XBqg
总结
System.Text.Json 是 ASP.NET Core Web API 中默认的 JSON 处理库,提供了丰富的配置选项和高性能的序列化与反序列化功能。通过合理配置和使用高级特性,可以满足各种复杂的业务需求。
猜你喜欢
- 2025-05-07 ASP.NET 8 MVC 和 MinIO 实现建立一个可以访问的数据库
- 2025-05-07 网站建设制作步骤有哪些?网站建设方案
- 2025-05-07 个人web开发我选Asp.net core,你选谁?PHP?还是JSP?
- 2025-05-07 在微服务中使用 ASP.NET Core 实现事件溯源和 CQRS
- 2025-05-07 微软宣布ASP.NET5开源,跨Win10、Mac和Linux
- 2025-05-07 网站建设制作流程有哪些?(网站建设流程,分为哪六个步骤)
- 2025-05-07 使用ASP.NET Core实现MongoDB的CRUD操作
- 2025-05-07 ASP.NET Web API中实现版本(asp.net web api教程)
- 2025-05-07 ASP.NET 8 Web API中使用ActionFilter和特性来实现接口幂等
- 2025-05-07 ASP.NET Core 9.0的7个方面重大更新!
- 最近发表
-
- 100%开源免费的低代码/可视化数据分析、数据展示平台
- Spring Boot跨域问题终极解决方案:3种方法根治CORS报错
- 永久免费内网穿透很简单,一看就明白
- Odoo 用户菜单架构解析及创建和管理实战
- 关于编码的那些事 - URL 编码(编码url是什么意思)
- 20 个让人惊叹的 JavaScript 单行代码技巧,效率瞬间提升
- 如何使用java.net.URLConnection发起和处理HTTP请求
- 崩溃!代码总掉链子?6 个 JavaScript 技巧助你稳操胜券
- 抓狂!代码总出错?5 个 JavaScript 技巧助你逆风翻盘
- 前端性能拉胯?这 8 个 JavaScript 技巧让你的代码飞起来!
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)