【问题标题】:Use JSON to post a collection of models to webapi使用 JSON 将模型集合发布到 webapi
【发布时间】:2013-01-17 05:29:12
【问题描述】:

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

有没有办法使用 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());
//...
}

关于如何让它自动绑定而不是必须转换的任何想法?

【问题讨论】:

  • 肯定有。 (我不使用 ASP.Net 的 MVC 东西。)你试过什么?你在哪里看过?这不可能是一个独特的(甚至是罕见的)用例,想要接收项目列表。 (它的 JSON 部分可能是一个数组。)
  • 快速搜索一下,这可能有用:stackoverflow.com/questions/402996/…(更彻底的搜索可能会找到更多有用的信息。)

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


【解决方案1】:

是的,但您的问题过于笼统,无法深入回答。使用 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/

【讨论】:

  • 正是我要说的。
【解决方案2】:

如果你坚持你的解决方案:

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

或,

您可以尝试类似(它来自我的代码):

    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() 的值吗??

【讨论】:

  • 谢谢!我刚刚发现 JSON.Stringify(data) 方法运行良好。花了一些时间来解析它,但效果很好!
【解决方案3】:

这非常有效。没有丑陋的 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"
  }
]

【讨论】:

    猜你喜欢
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 2017-05-17
    • 2015-10-29
    • 2021-03-24
    • 2019-01-30
    相关资源
    最近更新 更多