繁体   English   中英

将 Boolean 发布到 ASP.NET 核心 5 Controller 失败为“真”但不是真

[英]Posting Boolean to ASP.NET Core 5 Controller Fails for “true” but not true

我使用 curl 对 asp.net 核心 5 controller 进行如下发布请求

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”中删除引号并使其正确时,它会起作用,并且我的 controller 会获得正确的 boolean 值。 这是有效的 curl:

curl -d "{\"sponsorOnly\":true, \"id\":\"101\"}" -H "Content-Type: application/json" -X POST http://localhost:5000/rpc/Email/EmailGenerate

我的 asp.net 核心 5 controller 如下:

[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 核心中不起作用。

正如 Camilo Terevinto 在评论中已经提到的那样,不支持这种情况。 ASP.NET Core 3.x 及更高版本中的新默认 JSON 序列化程序不会将字符串"true""false"解析为 boolean。 JSON 规范也不支持这一点,该规范提供 boolean 文字truefalse ,甚至 JavaScript 也不会以你想要的方式解析"false" Boolean("false") === true

您应该更改客户端,以便它为布尔值生成正确的 JSON 文字,以便默认序列化程序可以正确处理此问题。

或者,您可以切换到Newtonsoft.Json ,它带有许多额外的内置行为,可以将这些字符串解析为布尔值。 迁移指南中描述了为 ASP.NET Core 3.x+ 应用程序启用 Newtonsoft.Json。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM