使用JSON将一组模型发布到webapi

时间:2013-02-01 20:06:31

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

这是我的情况。我构建了一个旨在填充报告的Web服务。它收到可变数量的“发现”,然后生成一个包含所有发现的报告。

有没有办法一次性使用JSON发布多个结果,并将其绑定到List对象?

编辑:

更具体地说,一个发现看起来像:

{title:“title”,description:“desc”,rating:“High”}

我希望能够让我的功能看起来像这样:

[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());
//...
}

如何让它自动绑定,而不是必须转换?

3 个答案:

答案 0 :(得分:2)

是的,但你的问题太笼统而无法深入回答。使用HttpRequest类,您可以指定您正在发布帖子并使有效内容成为JSON blob。该blob可以是对象列表。在服务器端,您可以读取该数据并将其序列化。我建议使用JSON.NET来做到这一点。您可以以非常静态的方式执行此操作,例如,您的列表是A类型的对象列表或从B, C, or D继承的类型A。如果在代码中创建这些对象定义,JSON.NET可以获取原始json(这些对象的数组)并将其转换为您在代码中定义的对象数组。

json.NET docs: http://james.newtonking.com/projects/json-net.aspx HttpRequest文档: http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx HttpRequest的抽象层: http://restsharp.org/

答案 1 :(得分: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()??

的值

答案 2 :(得分: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"
  }
]