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

时间:2019-08-27 16:06:19

标签: 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)
    {
    }

通过邮递员,我发布

{
"foo": "bar"
}

并接收

  

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

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

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

2 个答案:

答案 0 :(得分:17)

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

"foo"

要使用以下

{
  "foo": "bar"
}

您将需要一个类似这样的课程

public class MyClass
{
  public string Foo { get; set; }
}

然后将帖子更改为

// POST api/values
[HttpPost]
public void Post([FromBody] MyClass value)
{
}

希望有帮助

答案 1 :(得分:3)

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

// POST api/values
[HttpPost]
public void Post([FromBody] string foo)
{
}

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

{
"foo": "bar"
}
当您将字符串用作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
}

希望这会有所帮助