发送对象数组时,Web API [FromBody]参数为null

时间:2016-07-11 17:19:48

标签: c# asp.net asp.net-web-api

我似乎遇到了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也是一回事。

这里有一些截图: enter image description here enter image description here

4 个答案:

答案 0 :(得分:2)

在Postman中进行测试时,您的代码工作正常。

enter image description here

enter image description here

答案 1 :(得分:1)

原来我的MaxDepth的全局JSON设置在我的代码中的其他位置设置为2,该控件在控制器操作之前运行。为什么返回null而不是空对象仍然超出我的范围,但将其更改为3可以按预期更正问题和功能。

对不起大家的困惑,谢谢你的答案!

答案 2 :(得分:1)

我认为这一切都取决于你希望如何使用它,如果你想获得一个强类型模型,你总是可以像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>();
}

答案 3 :(得分:0)

WebApi使用模型映射类尝试使用参数og WebApi方法映射json对象。您可以通过创建一个包含与json对象匹配的所有属性的类来解决此问题。

public class Contract {
   public string Name { get; set; }
   public dynamic[] Keys { get; set; }
}

使用

更改WebApi方法的签名
public void Post([FromBody] Contract value)
{
}