2013-02-01 67 views
0

這是我的情況。我構建了一個旨在填充報告的Web服務。它收到可變數量的「調查結果」,然後生成一份包含所有調查結果的報告。使用JSON將模型集合發佈到webapi

是否有辦法一次使用JSON發佈多個發現,並將其綁定到List對象?

編輯:

所以更具體,這一發現將類似於:

{標題: 「標題」,說明: 「遞減」,評價: 「高」}

我希望能有我的功能看起來像這樣:

[HttpPost] 
public string Post(IList<Finding> findings){ 
    //code... 
} 

public class Finding{ 
    public string title {get; set;} 
    //... 
} 

所以基本上我想那些JSON結果數組綁定到一個IList

更新: 我期望能夠自動綁定它。我目前能夠通過發佈JSON字符串(透過JSON.stringify)

這裏的解決辦法是我的代碼工作:

[HttpPost] 
public string Post([FromBody]object jsonString){ 
IList<Finding> findingList = JsonConvert.DeserializeObject<IList<Finding>>(jsonString.toString()); 
//... 
} 

如何得到這個自動綁定,而不需要任何想法兌換?

+0

當然必須有。 (我不使用ASP.Net的MVC的東西。)你有什麼嘗試?你在哪裏看?這不能是一個獨特的(或者甚至是罕見的)用例,想要接收一個項目列表。 (它的JSON方面可能是一個數組。) –

+0

快速搜索給出了這個,這可能是有用的:http://stackoverflow.com/questions/402996/deserializing-json-objects-as-listtype-not-working -with-asmx-service(更徹底的搜索可能會發現更多有用的信息。) –

回答

0

如果你留在你的解決方案:

[HttpPost] 
public string Post([FromBody]object jsonString){ 
IList<Finding> findingList = JsonConvert.DeserializeObject<IList<Finding>>  (jsonString.toString()); 
//... 
} 

我認爲,你可以:

[HttpPost] 
public string Post(string jsonString){ 
IList<Finding> findingList = JsonConvert.DeserializeObject<IList<Finding>>  (jsonString); 
//... 
} 

...在你的Ajax調用:

$.ajax({ 
    ... 
    data: JSON.Stringify(data), 
    ... 
    }); 

OR,

你可以嘗試類似的信息(它來自我的代碼):

var LoginFormSubmitHandler = function (e) { 
    var $form = $(this); 
    // We check if jQuery.validator exists on the form 
    if (!$form.valid || $form.valid()) { 

     $.post($form.attr('action'), $form.serializeArray()) 
     ... 

...你能不能顯示$ form.serializeArray()的值?

+0

謝謝!我只是發現JSON.Stringify(數據)方法運行良好。花了一些時間來解析它,但效果很好! – appsecguy

2

是的,但您的問題太籠統,無法深入解答。使用HttpRequest類,您可以指定您正在進行發佈並使有效負載成爲JSON blob。該blob可以是對象列表。在服務器端,您可以讀取並序列化數據。我會建議使用JSON.NET來做到這一點。你可以用一種非常靜態的方式來做,比如你的列表是A類型的對象列表,或者是從A繼承的類型B, C, or D。如果您在代碼中創建這些對象定義,JSON.NET可以將原始json(這些對象的數組)轉換爲您在代碼中定義的對象的數組。

json.NET文檔: http://james.newtonking.com/projects/json-net.aspx HttpRequest的文檔: http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx 的HttpRequest的一個抽象層: http://restsharp.org/

+0

準確地說,我要說的是。 – jason

0

這個效果很好。沒有醜陋的JSON反序列化。

[ResponseType(typeof(Customer))] 
public async Task<IHttpActionResult> PostCustomer(IEnumerable<Customer> customers) 
{ 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 
    db.Customers.AddRange(customers); 
    await db.SaveChangesAsync(); 
    return StatusCode(HttpStatusCode.Created); 
} 

而且撥打:

...api/Customers 

與POST形式身體:

地址:.../API/

[ 
    { 
    "SampleProperty": "SampleValue1" 
    ... 
    ... 
    }, 
    { 
    "SampleProperty": "SampleValue2" 
    } 
]