MVC 5没有将JSON对象数组解析为.NET对象数组,为什么?

时间:2014-05-05 21:51:49

标签: ajax arrays asp.net-mvc json json-deserialization

我有一个接受如下对象的动作:

 public class OrderSubmissionViewModel
    {
        /* Some properties trimmed for brevity */

        public OrderSubmissionProductViewModel[] Products { get; set; }
    }

底部属性OrderSubmissionProductViewModel数组如下所示:

    public class OrderSubmissionProductViewModel
    {
        public int Id { get; set; }
        public decimal Price { get; set; }
        public int Qty { get; set; }
        public decimal Tax { get; set; }
    }

Javascript(淘汰赛)视图模型如下所示:

var OrderSubmissionViewModel = function (viewModel) {
    var self = this;

    /* Omitted Properties that parse fine */

    self.Products = $.map(viewModel.productList(), function (v, i) {
        return {
            Id: v.Id,
            Price: v.Price(),
            Qty: v.Qty(),
            Tax: v.Tax()
        }
    });
}

我有一个带有此签名的动作:

public ActionResult SubmitOrder(OrderSubmissionViewModel submission)

由以下Javascript函数使用:

self.submitOrder = function () {
    var submission = new OrderSubmissionViewModel(self);

$.ajax({
    url: self.urlSubmitOrder,
    data: JSON.stringify({ submission: submission }),
    type: 'POST',
    contentType: "application/json; charset=utf-8",
    success: function () { alert("Submitted"); },
    fail: function () { alert("Failed"); }
});
}

由于某种原因,我的视图中通过ajax的任何形式的对象数组都没有被正确解析,我的Products属性变为空或null。其他属性(如int和字符串)可以很好地解析。

提交对象有JSON.stringify,在Fiddler中看起来像这样(为简洁起见,其他一些属性被修剪):

{"submission":{"Products":[{"Id":8888,"Price":16,"Qty":1,"Tax":1.48},{"Id":8787,"Price":8.99,"Qty":1,"Tax":0.83}]}}

如果我将JSON.stringify放在内部数组上,它看起来像:

{"submission":{"Products":"[{\"Id\":8888,\"Price\":16,\"Qty\":1,\"Tax\":1.48},{\"Id\":8787,\"Price\":8.99,\"Qty\":1,\"Tax\":0.83}]"}}

控制器不会解析任何一个!有没有人有任何想法?

2 个答案:

答案 0 :(得分:1)

您的JSON有一个顶级属性,名为"提交"您的.NET对象没有。这将使它无法正确解析为对象,但我无法100%确定地说这就是原因。

根据您的编辑,这是我的编辑:

self.submitOrder = function () {
    var submission = new OrderSubmissionViewModel(self);

$.ajax({
    url: self.urlSubmitOrder,
    data: JSON.stringify({ submission }),
    type: 'POST',
    contentType: "application/json; charset=utf-8",
    success: function () { alert("Submitted"); },
    fail: function () { alert("Failed"); }
});
}

答案 1 :(得分:1)

您的JSON具有属性“提交”,该属性不在您的C#对象中,因此无法对其进行解析。产品需要位于JSON对象的顶层,如下所示:

{"Products":"[{\"Id\":8888,\"Price\":16,\"Qty\":1,\"Tax\":1.48},
{\"Id\":8787,\"Price\":8.99,\"Qty\":1,\"Tax\":0.83}]"}

然后JSON结构与C#结构匹配,它应该没问题(除非你还有其他一些问题)