【问题标题】:Parsing json in ASP.NET MVC4 controller在 ASP.NET MVC4 控制器中解析 json
【发布时间】:2013-11-22 14:25:56
【问题描述】:

json 使用 POST 方法从浏览器传递到服务器中的 ASP.NET MVC4 应用程序控制器。 它包含属性,其中 3 个是 0.. 20 个元素的数组(在所有这些元素下面的代码中 只有 1 个元素)。 如何在 C# 中解析这个 json? 我尝试了带有签名的控制器

public JsonResult RegisterSales(Sale mysale)

但未分配 mysale 属性。

通过json:

{ "id":"sale1",
  "sale_date":"2013-11-10 19:20:44"
  "taxes":[{"id":"km20pr","name":"20%","rate":0.2}],
  "products":[{"id":"prod1",
            "sale_id":"sale1",
            "register_id":"register1",
            "quantity":"1.00000"}],

  "payments":[{"id":"payment1",
            "sale_id":"sale1",
            "register_id":"register1",
           "amount": 0
      }]
 }

它应该被解析为类似 C# 的结构

public class Sale
        {
            public string id;
            public DateTime sale_date;
            public Tax[] taxes;
            public Product[] products;
            public Payment[] payments;
        }

public class Tax
        {
            public string id, name;
            public decimal rate;
        }

public class Product
        {
            public string id, sale_id, register_id;
            public decimal quantity;
        }


public class Payment
        {
            public string id, sale_id, register_id;
            public decimal amount;
        }

【问题讨论】:

  • 如何将 JSON 发布到 MVC? (代码才是真正重要的)。例如AJAX => 你发送的数据是什么?
  • http POST 请求正文包含有问题发布的文本 - json。我将{get; set;} 添加到每个相关类中的每个属性中,看起来属性中填充了数据。这是最好的解决方案吗?

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


【解决方案1】:

最好的办法是为 json 使用与您的接受变量“mysale”相同的名称。 示例:

"mysale": { "id":"sale1",
  "sale_date":"2013-11-10 19:20:44"
  "taxes":[{"id":"km20pr","name":"20%","rate":0.2}],
  "products":[{"id":"prod1",
            "sale_id":"sale1",
            "register_id":"register1",
            "quantity":"1.00000"}],

  "payments":[{"id":"payment1",
            "sale_id":"sale1",
            "register_id":"register1",
           "amount": 0
      }]
 }

您可以通过在 AJAX 调用中添加名称来做到这一点:

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

现在它将接受您的 JSON。

这样做的原因是,发布的 JSON 将被视为一个帖子值,就像使用普通表单一样,您可以通过其名称来捕获该值。

所以回答你的问题:添加 {get;set;} 不是最好的方法。

【讨论】:

    【解决方案2】:

    使用 NewtonSoft JSON 反序列化,如下所示:

    class School
    {
        public string student;
        public object[] data;
    }
    
    School datum = JsonConvert.Deserialize<School>(jsonStr);
    //Do stuff with datum...
    

    享受。

    【讨论】:

    • 我添加了 {get; set;} 到每个属性,看起来现在 json 已正确解析。这是最好的解决方案吗?
    • NewtonSoft 是据我所知最快的方法。
    【解决方案3】:

    您需要发布具有正确内容类型的数据。在这种情况下,它是应用程序/json。 MVC 根据用于向服务器发送数据的内容类型选择正确的绑定模式。

    【讨论】:

    • post 中的 Http 标头包含 Content-Type:application/json; charset=UTF-8 所以看起来它是正确的。我在每个属性中添加了{get; set;},看起来现在 json 已正确解析。这是最好的解决方案吗?
    • 对不起,我错过了您使用字段。 MVC 模型绑定器仅在进行绑定时查找可设置的字段。如果要使用NewtonSoft的序列化器,可以换掉MVC默认的JSON序列化器see here for a guideline
    • 我尝试使用它,但日期仍以 Microsoft 格式返回。我把它贴在stackoverflow.com/questions/20035870/…
    猜你喜欢
    • 2013-01-05
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多