传递给ApiController的JSON不会反序列化字符串值

时间:2016-06-21 22:37:59

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

我正在尝试将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:

enter image description here

我缺少什么?
编辑:我已经找到了一个答案并将其发布在下面。但我仍在寻找更好的答案......

2 个答案:

答案 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对象)。