2016-06-21 87 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]它正常工作。 –