【问题标题】:Unexpected character encountered while parsing value: . Path '', line 1, position 1解析值时遇到意外字符: 。路径'',第 1 行,位置 1
【发布时间】:2019-12-31 20:45:20
【问题描述】:

我创建了一个开箱即用的 .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。

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

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

【问题讨论】:

    标签: c# asp.net-core


    【解决方案1】:

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

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

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

    {
    "foo": "bar"
    }
    

    当您使用字符串作为 FromBody 属性的参数时,会出现解析错误。开发人员倾向于将内容包装在一个类中,因此在这种情况下,绑定工作得很好。另一种方法是将对象作为参数传递,但您需要在操作方法中对其进行反序列化,而不是 .net 核心为您进行绑定。

    // 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
    }
    

    希望对你有帮助

    【讨论】:

    • 这更适合我的预期目的。
    • 这样效果更好。这可用于发送大量 JSON 数据。
    【解决方案2】:

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

    "foo"
    

    使用下面的

    {
      "foo": "bar"
    }
    

    你需要这样的课程

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

    然后将帖子更改为

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

    希望有帮助

    【讨论】:

      猜你喜欢
      • 2020-01-15
      • 2020-11-26
      • 1970-01-01
      • 2018-07-25
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-30
      相关资源
      最近更新 更多