我正在尝试将JSON数组传递给ApiController,但字符串值没有反序列化(它们被设置为空值)。奇怪的是,我仍然得到正确数量的元素。
A有一个ApiController:
[RoutePrefix("api/language")]
public class LanguagePairApiController : ApiController
使用post方法:
// POST: api/language/create
[HttpPost]
[Route("create")]
public string Create([FromBody]LanguagePair[] languagePairs)
我正在向它发送JSON:
[
{"Key":"Test","Value":"Test","Version":"1.0"},
{"Key":"Areyousure","Value":"Are you sure?","Version":"1.0"},
{"Key":"File","Value":"File","Version":"1.0"}
]
这是我试图将其映射到的课程:
public class LanguagePair
{
public string Key { get; set; }
public string Value { get; set; }
public string Version { get; set; }
}
但字符串值为null:
我缺少什么?
编辑:我已经找到了一个答案并将其发布在下面。但我仍在寻找更好的答案......
答案 0 :(得分:2)
我明白了。我需要使用DataContract和DataMember属性来装饰类:
{
[DataContract]
public class LanguagePair
{
[DataMember]
public string Key { get; set; }
[DataMember]
public string Value { get; set; }
[DataMember]
public string Version { get; set; }
}
}
答案 1 :(得分:1)
阅读Parameter Binding in ASP.NET Web API
您需要从动作中删除[FromBody]
属性...
// POST: api/language/create
[HttpPost]
[Route("create")]
public string Create(LanguagePair[] languagePairs) { ... }
你可以像以前一样保持你的课程精益:
public class LanguagePair
{
public string Key { get; set; }
public string Value { get; set; }
public string Version { get; set; }
}
使用[FromBody]
要强制Web API 从请求正文中读取简单类型,请添加
[FromBody]
属性为参数:public HttpResponseMessage Post([FromBody] string name) { ... }
在此示例中,Web API将使用媒体类型格式化程序来读取 请求正文中的name值。这是一个示例客户端 请求。
POST http://localhost:5076/api/values HTTP/1.1 User-Agent: Fiddler Host: localhost:5076 Content-Type: application/json Content-Length: 7 "Alice"
当参数具有
[FromBody]
时,Web API使用Content-Type 标题以选择格式化程序。在此示例中,内容类型为 “application / json”和请求体是一个原始的JSON字符串(不是 JSON对象)。