[英]Web API [FromBody] parameter is null when sending an array of objects
我似乎已经遇到了Web API的一个有趣的问题-使用此控制器操作,在左花括号处有一个断点来检查thing
:
[HttpPut]
public void Test([FromBody]object thing)
{
}
如果我提交以下请求(作为CURL),则会得到期望值,该期望值是包含主体数据的JObject:
curl -X PUT -H "Content-Type: application/json" -d '{
"Name": "Joe",
"Key": { "Key": "Value" }
}' "http://localhost/api/TestController/Test"
也就是说,其中Name
是Joe且Key
是另一个包含Key = Value
对象的匿名对象。
但是,如果我稍稍更改此设置以改为提交Keys
数组,则会得到null
。 没有错误,只是null
。
curl -X PUT -H "Content-Type: application/json" -d '{
"Name": "Joe",
"Keys": [{ "Key": "Value" }]
}' "http://localhost/api/TestController/Test"
为什么会这样呢? HTTP动词似乎无关紧要(我尝试过POST和PUT),并且使用dynamic
代替object
是同一回事。
原来我在代码中的其他位置将MaxDepth
的全局JSON设置设置为2
,该设置在控制器动作之前运行。 为什么它返回null
而不是空对象的原因仍然不在我的范围内,但是将其更改为3
可以解决问题并按预期运行。
抱歉给大家带来的困扰,谢谢您的回答!
我认为这完全取决于您希望如何使用它,如果您想获得一个强类型化的模型,您可以随时创建一个像user3658685所说的模型。
您可以做的另一件事是将数据绑定到JObject,然后使用Newton-soft Serializer进行序列化:
public void Post([FromBody] JObject value)
{
//instead of object you can use any type you wish to cast
object obj = value.ToObject<object>();
}
WebApi使用模型映射类来尝试使用WebApi方法的参数映射json对象。 您可以通过创建一个具有与json对象匹配的所有属性的类来解决此问题。
public class Contract {
public string Name { get; set; }
public dynamic[] Keys { get; set; }
}
并更改您的WebApi方法的签名
public void Post([FromBody] Contract value)
{
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.