3

我已经在网上搜索了几个小时,并尝试了许多不同的解决方案,这些解决方案也在 StackOverflow 上进行了描述。我知道以前有人问过类似的问题,但没有一个答案或评论对我有用。

问题:我有一个带有一些参数的 Post 方法的 .NET Web API。其中一个参数是一个复杂的对象,应该从正文中读取(即 JSON)。但是,此对象始终为 null

这是我的代码:

// POST api/worksheets/post_event/true/false
        [Route("post_event/{newWorksheet}/{eindEvent}")]
        [HttpPost]
        public Event Post(bool newWorksheet, bool eindEvent, [FromBody] Event eventData)
        {
            return eventData;
        }

需要明确的是:eventData 是始终为空的对象。布尔值被正确读取。

完整的请求正文是:

POST http://localhost:5000/api/worksheets/post_event/true/false
Content-Type: application/json
{"Persnr":1011875, "WorksheetId":null, "Projectnr":81445, "Uursoort":8678, "Tijd":{"09-08-2016 9:25"}}

作为参考,这是事件类:

public class Event
    {
        public long Persnr { get; set; }
        public int WorksheetId { get; set; }
        public int Projectnr { get; set; }
        public int Uursoort { get; set; }
        public DateTime Tijd { get; set; }
    }

我已经尝试过的一些事情:

  • 将 JSON 更改为不同的格式(仅值,"Event": {} 围绕实际对象,= 在 JSON 前面)。
  • 仅使用 Event 参数进行测试(删除其他参数以及路由中的参数)
  • 将默认 ctor 添加到 Event。
  • 删除 [FromBody] 标签。如果我这样做,事件对象不为空,但所有属性都是。可以通过 URI 填充属性,但这不是所需的行为。

根据我读过的所有解决方案和文档,它应该按照我上面显示的方式工作。我错过了什么?

4

3 回答 3

1

您的 json 对象无效。我的建议是始终运行通过 json 解析器手动编写的 json 对象,如下所示:http: //json.parser.online.fr/

"Tijd":{"09-08-2016 9:25"}

应该改为

"Tijd":["09-08-2016 9:25"]
于 2016-08-09T15:20:29.640 回答
0

这种类型的正确 JSON 应该只是

{"Persnr":1011875, "WorksheetId":null, "Projectnr":81445, "Uursoort":8678, "Tijd":"09-08-2016 9:25"}

Tijd 没有花括号,因为 Tijd 是纯 DateTime 属性,可以从字符串中推断出来,表示 DateTime

于 2016-08-09T15:43:07.917 回答
0

当您的对象无法从 JSON 请求反序列化时,通常会发生这种情况。

最佳实践是确保所有请求属性都可以接受null(使值类型属性可以为)。然后您可以验证是否提供了所有需要的请求属性,否则返回400 错误。通过这种方式,您至少能够了解导致问题的请求属性。

于 2017-09-13T11:30:50.027 回答