在 MVC 控制器中接收 JSON

Posted

技术标签:

【中文标题】在 MVC 控制器中接收 JSON【英文标题】:Receive JSON in MVC controller 【发布时间】:2017-12-14 04:12:11 【问题描述】:

这是我第一次使用 JSON,在我的控制器中解析和使用它时遇到了一些麻烦。我已经尝试过Unable to successfully receive JSON data to .NET MVC Controller、How to receive JSON as an MVC 5 action method parameter 这些解决方案,但没有一个适合我。

我正在从我的 html 中检索一些数据并通过 ajax 将数组发送到以下代码中的控制器:

JQuery:

var values = $('ul#values li').map(function() 
   return this.textContent;
).get()

var lines = $('ul#lines li').map(function() 
    return 
       Column: this.textContent,
       Table: this.getAttribute("name")
    ;
).get();

var columns = $('ul#lines li').map(function() 
    return 
       Column: this.textContent,
       Table: this.getAttribute("name")
    ;
).get();

var filters = $('ul#filters li.panel').map(function () 

            var n = this.getAttribute("name");

            var c = $(this).children()[1].textContent;

            var r = $(this).find("li input:checked").map(function() 
                return this.parentNode.textContent;
            ).get();
            if (r.length === 0)
                return null;
            else
                return  table: n, name:c, vals: r ;
        ).get();


 $.ajax(
        type: "POST",
        url: "/Home/PivotTable",
        dataType: "json",
        traditional: true,
        data: 
            indicators: values,
            lines: JSON.stringify(lines) ,
            columns:  JSON.stringify(columns),
            filters:  JSON.stringify(filters)
        ,
        success: function (data) 
            alert(data.s, data.l);
        

    );

这是正在发布的表单数据:

indicators:  Taxa Mensal de inflação
lines:["Column":"  Base","Table":"D_Base"]
columns:["col":"  Trimestre","table":"D_Calendario"]
filters:["table":"D_PF_ClasseProdutos","name":"  Código","vals":[" 22"," 23"]]

并在我需要访问数据的控制器中接收数据:

public JsonResult PivotTable(string[] indicators, Lines[]  lines, object[] columns, object[] filters)
        
            string sa = indicators[0];

            var l = lines;
            var col = columns;
            var fil = filters;

            var result = new  s = sa, l=l[0].Column;
            return Json(result, JsonRequestBehavior.AllowGet);
        

public class Lines
        
            public string Column  get; set; 
            public string Table  get; set; 
        

我尝试将线绑定到一个对象,就像其中一个链接中的解决方案一样,但是得到了

用户代码未处理 NullRefrenceException

而其他参数接收适当的 data,但我无法访问对象的属性。

我做错了什么,如何解析数据或将其绑定到对象?

【问题讨论】:

请向我们展示Lines 类的代码。此外,您不能像那样使用object[] columns(过滤器也是如此)。您需要使用YourConcreteClass[] columns 删除JSON.stringify() 调用。您实际上是在这些属性中双重包装 JSON,因为 jQuery 将在发送之前序列化整个对象 Lines 类的代码在控制器下面,但是使用类给了我 NullReference 错误。与此同时,我会尝试你的建议 删除 JSON.stringify() 使数据成为对象而不是 JSON 【参考方案1】:

您可以尝试使用 Json.NET 库,它允许您进行序列化和反序列化。

将您的参数作为字符串传递并执行以下操作:

Lines[] m = JsonConvert.DeserializeObject<Lines>(lines); 

【讨论】:

您的解决方案解决了我的问题。我必须更改 Lines[ ] m = JsonConvert.DeserializeObject&lt;Lines[ ]&gt;(lines); 谢谢!

以上是关于在 MVC 控制器中接收 JSON的主要内容,如果未能解决你的问题,请参考以下文章

.net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (二)

C# WebApi 通过 body 从 C# MVC 接收 json

如何将对象类型的 json 数组传递给 MVC 控制器类

支持Java Spring MVC

asp.net mvc 控制器返回 json List<T> 未知错误

在 mvc 控制器中从 jquery 接收复杂对象