首页 > 解决方案 > 将布尔值发布到 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 中无效。

标签: c#asp.net-core

解决方案


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

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

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


推荐阅读