c# - 将布尔值发布到 ASP.NET Core 5 控制器失败为“真”但不是真的
问题描述
我使用 curl 向 asp.net core 5 控制器发出如下请求
curl -d "{\"sponsorOnly\":\"true\", \"id\":\"101\"}" -H "Content-Type: application/json" -X POST http://localhost:5000/rpc/Email/EmailGenerate
它给了我以下错误:
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "00-7b45947384087a49b8b37125f7424172-a0e14922a4546649-00",
"errors": {
"$.sponsorOnly": [
"The JSON value could not be converted to System.Boolean. Path: $.sponsorOnly | LineNumber: 0 | BytePositionInLine: 21."
]
}
}
当我从“true”中删除引号并使其正确时,它会起作用,并且我的控制器会获得正确的布尔值。这是有效的卷曲:
curl -d "{\"sponsorOnly\":true, \"id\":\"101\"}" -H "Content-Type: application/json" -X POST http://localhost:5000/rpc/Email/EmailGenerate
我的 asp.net core 5 控制器如下:
[ApiController]
public class EmailController : ControllerBase
{
[HttpPost("/rpc/Email/EmailGenerate")]
public object Post(EmailSendDetail emailSendDetail)
{
return new OkResult();
}...
和 EmailSendDetail 作为
public class EmailSendDetail
{
public int Id { get; set; }
public bool SponsorOnly { get; set; }
}
这种用法在 ASP.NET 中有效(将布尔值传递给 POST 方法),但在 ASP.NET Core 中无效。
解决方案
正如 Camilo Terevinto 在评论中已经提到的那样,不支持这种情况。ASP.NET Core 3.x 及更高版本中新的默认 JSON 序列化程序不会将字符串解析"true"
为"false"
布尔值。JSON 规范也不支持这一点,它提供布尔文字true
,false
甚至 JavaScript 也不会"false"
按照你想要的方式解析(Boolean("false") === true
在 JavaScript 中)。
您应该更改客户端,以便它为布尔值生成正确的 JSON 文字,以便默认序列化程序可以正确处理此问题。
或者,您可以切换到Newtonsoft.Json,它带有许多额外的内置行为,可以将这些字符串解析为布尔值。迁移指南中描述了为 ASP.NET Core 3.x+ 应用程序启用 Newtonsoft.Json 。
推荐阅读
- java - 在Spring的编译期间用另一个注解替换一个注解?
- r - 使用 data.table 连接半个表的笛卡尔
- rust - 哪种获取结构字段引用的方法是首选方法?
- excel - 如何使用 .vbs 将 .bas 文件导入 excel
- python - 在所有路线的顶部栏内渲染表单
- game-engine - 游戏引擎物理精度(例如 TrackMania “Press Forward Maps”)
- svn - 标记 svn 存储库中的特定文件集
- javascript - 我究竟做错了什么?随着时间的推移,Javascript 的行为变得怪异 (setInterval())
- ios - 快速实现加载微调器
- java - 如何在每个 webflux 请求上应用 WebClient.attribute?