如何在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
- 将JSON内容保存为UTF-8编码的文件(例如
data.json),内容为:
{"name": "ç"}
- 执行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
相关产品推荐
相关产品推荐

