You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ASP.NET Core中用[FromBody]反序列化含特殊字符的JSON?

解决ASP.NET Core [FromBody]反序列化含特殊字符JSON的错误

错误原因

从错误栈和细节来看,核心问题是请求体编码不符合UTF-8标准:

  • curl在部分环境(如Windows CMD)发送非ASCII字符时,会采用系统默认编码(比如GBK)而非UTF-8,导致服务端收到的ç对应字节为E7(GBK编码),而非UTF-8标准的C3 A7。
  • System.Text.Json默认仅支持UTF-8编码的JSON,无法解析非UTF-8的字节流,因此抛出转码失败的错误。

解决方案

方案1:修正客户端curl请求

确保请求以UTF-8编码发送JSON,有两种可行方式:

方式A:指定编码头并使用--data-raw

在支持UTF-8的终端(如PowerShell)中执行:

curl -X POST http://localhost:5000/example -H "Content-Type: application/json; charset=utf-8" --data-raw '{"name": "ç"}'

方式B:通过UTF-8文件发送JSON

  1. 将JSON内容保存为UTF-8编码的文件(例如data.json),内容为:
{"name": "ç"}
  1. 执行curl命令读取文件发送:
curl -X POST http://localhost:5000/example -H "Content-Type: application/json; charset=utf-8" -d @data.json

方案2:服务端强制UTF-8解析

如果需要兼容可能发送非UTF-8编码请求的客户端,可在服务端配置强制使用UTF-8处理请求体:

修改Program.cs中的AddControllers配置:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers(options =>
{
    // 获取默认JSON输入格式化器,强制仅支持UTF-8编码
    var jsonInputFormatter = options.InputFormatters.OfType<SystemTextJsonInputFormatter>().First();
    jsonInputFormatter.SupportedEncodings.Clear();
    jsonInputFormatter.SupportedEncodings.Add(System.Text.Encoding.UTF8);
})
.AddJsonOptions(options =>
{
    // 允许序列化/反序列化时处理特殊字符
    options.JsonSerializerOptions.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
});

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// 其余代码保持不变

验证

执行修正后的curl请求,或用Postman等工具发送UTF-8编码的JSON请求,控制器将能正常反序列化Example对象并返回结果。


内容的提问来源于stack exchange,提问作者Igor N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 06:05:24