我似乎遇到了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
也是一回事。
答案 0 :(得分:2)
答案 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)
{
}