2016-06-21 86 views
0

我试图将一个JSON数组传递给一个ApiController,但字符串值不是反序列化(它们被设置为空值)。奇怪的是,我仍然得到正确数量的元素。传递给ApiController的JSON不反序列化字符串值

一个有ApiController:

[RoutePrefix("api/language")] 
public class LanguagePairApiController : ApiController 

与后法:

// 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"} 
] 

这是I类” m试图将其映射到:

public class LanguagePair 
{ 
    public string Key { get; set; } 
    public string Value { get; set; } 
    public string Version { get; set; } 
} 

但该字符串值作为空未来通过:

enter image description here

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

+0

我对asp.net不太了解,但是有没有一些机制可以自动启动骆驼案件对象的属性?尝试发送'[{“key”:“win”}]''。 –

+0

什么是您使用的实际jQuery – NSGaga

回答

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

如果您想调整JSON属性的名称(例如send {“myKey”:“Areyousure”,“问题事件与空间”:“你确定?”,“v “:”1.0“})您可以相应地使用:语言对的[DataMember(Name =”myKey“)],[DataMember(Name =”带空格的问题事件“)],[DataMember(Name =”v“)]在C#中的属性# –

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]

要强制网络API来读取请求主体简单类型, [FromBody]属性添加到参数:

public HttpResponseMessage Post([FromBody] string name) { ... } 

在这个例子中,网络API将使用媒体格式化程序从请求主体读取名称的 值。这里是一个示例客户端 请求。

POST http://localhost:5076/api/values HTTP/1.1 
User-Agent: Fiddler 
Host: localhost:5076 
Content-Type: application/json 
Content-Length: 7 

"Alice" 

当一个参数具有[FromBody],网络API使用的Content-Type 头,选择格式化。在此示例中,内容类型为 “application/json”,请求正文为原始JSON字符串(不是 JSON对象)。

+1

我只是试过这个,我得到了相同的结果(3个对象的数组与所有值== null)。但[FromBody]没有做任何事情 - 如果我删除它并保持[DataContract]它正常工作。 –