ASP.NET Core 3.0 [FromBody]字符串内容返回“无法将JSON值转换为System.String。”

Pou*_*sen 1 c# asp.net-core

在ASP.NET Core 3.0中使用[FromBody]字符串内容会ApiController返回验证错误:

{"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
 "title":"One or more validation errors occurred.",
 "status":400,
 "traceId":"|9dd96d96-4e64bafba4ba0245.",
 "errors":{"$":["The JSON value could not be converted to System.String. Path: $ | LineNumber: 0 | BytePositionInLine: 1."]}}
Run Code Online (Sandbox Code Playgroud)

当客户端发布具有content-type的数据时: application/json

如何在.NET Core 3.0的api控制器中以字符串形式获取原始json数据?无需客户端更新其内容类型?

Ame*_*eya 28

如果您使用的是 asp.net core 3.0,那么它具有内置的 JSON 支持。我使用了以下内容,它无需设置自定义输入处理程序即可工作。

[HttpPost]
public async Task<IActionResult> Index([FromBody] JsonElement body)
{

    string json = System.Text.Json.JsonSerializer.Serialize(body);
    return Ok();

}
Run Code Online (Sandbox Code Playgroud)


小智 14

更改[FromBody] string content为[FromBody] object content然后如果您想/需要读取为字符串使用content.ToString()


Ton*_*Ngo 5

Not sure this help but I think they made some change in .net core 3.0 Newtonsoft.JSON package so you can try this

Install Microsoft.AspNetCore.Mvc.NewtonsoftJson package.

In your startup.cs add

services.AddControllers().AddNewtonsoftJson();

  • 3.0 升级后,我的 [FromBody] JSON 参数返回 null。这解决了它。谢谢! (5认同)

Cra*_*AVE 5

如果您将参数更改[FromBody] String value为[FromBody] YourType value它,则会自动为您反序列化。

从:

// POST api/<SelectiveCallRulesController>
[HttpPost]
public async Task Post([FromBody] String rule)        
{
...
Run Code Online (Sandbox Code Playgroud)

到:

// POST api/<SelectiveCallRulesController>
[HttpPost]
public async Task Post([FromBody] SelectiveCallRule rule)        
{
...
Run Code Online (Sandbox Code Playgroud)

它让我四处走动,直到我意识到有关反序列化的错误消息是正确的!

  • 问题是有时您无法反序列化该值,因为您不确切知道将获得什么类型的对象。 (4认同)