解析值时遇到意外字符。路径'',第1行,位置1

Joh*_*gel 4 c# asp.net-core

我已经创建了一个现成的.NET Core 2.2解决方案并运行它。如:

  1. 创建项目,选择ASP.NET Core Web应用程序。
  2. 选择API作为项目模板。
  3. F5

这为我提供了默认ValuesController类中的POST处理代码:

    // POST api/values
    [HttpPost]
    public void Post([FromBody] string value)
    {
    }
Run Code Online (Sandbox Code Playgroud)

通过邮递员,我发布

{
"foo": "bar"
}
Run Code Online (Sandbox Code Playgroud)

并收到

解析值时遇到意外字符。路径'',第1行,位置1。

错误甚至在未达到“我的”(开箱即用)代码之前发生。我看到了许多有关序列化的参考,但这是在我有机会接触有效负载之前发生的。

缺少什么(可能非常简单)配置?

SWi*_*lko 13

要在Postman中达到默认端点,请在正文中添加以下内容

"foo"
Run Code Online (Sandbox Code Playgroud)

使用以下

{
  "foo": "bar"
}
Run Code Online (Sandbox Code Playgroud)

你需要这样的课

public class MyClass
{
  public string Foo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后将帖子更改为

// POST api/values
[HttpPost]
public void Post([FromBody] MyClass value)
{
}
Run Code Online (Sandbox Code Playgroud)

希望能有所帮助


tin*_*ike 6

{}您可以发送正文中不带括号和键的 JSON

从:

{
  "foo": "bar"
}
Run Code Online (Sandbox Code Playgroud)

简单地发送:

"bar"
Run Code Online (Sandbox Code Playgroud)

现在,这将与控制器端点中的字符串参数一起使用(就像以前一样):

// POST api/values
[HttpPost]
public void Post([FromBody] string value)
{
}
Run Code Online (Sandbox Code Playgroud)

更多信息

当您在括号中发送 JSON 时,您将发送一个objectwith keys,并且values控制器端点将收到该 JSON。以这种方式发送 Json 需要class接收端与propertiesJSON进行匹配object,才能正确读取数据。

此解决方案仅将实际内容value作为 a发送string,这就是为什么您不需要 aclass来接收它。

信用:https ://stackoverflow.com/a/57919764/15337673


Zin*_*nov 5

.net core 默认使用命名约定进行绑定。您的问题是您作为 JSON 传递的内容与操作方法接收的值不匹配。将参数名称更改为foo它应该可以工作

// POST api/values
[HttpPost]
public void Post([FromBody] string foo)
{
}
Run Code Online (Sandbox Code Playgroud)

现在使用 .net core 3.1,默认序列化程序不是 Newtonsoft,现在传递这样的字符串

{
"foo": "bar"
}
Run Code Online (Sandbox Code Playgroud)

当您使用字符串作为 FromBody 属性上的参数时,会给您一个解析错误。开发人员倾向于将内容包装在一个类中,因此在这种情况下绑定可以正常工作。另一种方法是传递一个对象作为参数,但您需要在 action 方法中反序列化它,而不是 .net core 为您进行绑定。

// POST api/values
[HttpPost]
public void Post([FromBody] object foo)
{
    //deserialize the object into your class or if it is a string. call foo.ToStrig() and get the value you need from there
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助