在MVC控制器中解析JSON时无效的JSON原语

时间:2013-07-07 16:32:46

标签: javascript asp.net-mvc json asp.net-mvc-3 asp.net-mvc-4

我在JavaScript中创建了一个JSON字符串,并将其发送到mvc应用程序中的控制器。我的代码创建了JSON字符串:

     $('#btnassign').click(function () {

            var arrPrice = "";
            var arrMarkUP = "";

            $("table tr").each(function () {

                if ($(this).find('input:checkbox:first').is(':checked')) {

                    if ($(this).find('input.inputprice').val() != "") {
                        arrPrice += "{";
                        var price = $(this).find('input.inputprice').val();
                        var id = $(this).find('input[type=hidden]').val();
                        arrPrice += '"Id":"' + id + '","Price":"' + price + '"';
                        arrPrice += "},";
                    }
                    if ($(this).find('input.inputmarkup').val() != "") {
                        arrMarkUP += "{";
                        var price = $(this).find('input.inputmarkup').val();
                        var id = $(this).find('input[type=hidden]').val();
                        arrMarkUP += "Id:" + id + ",Price:" + price;
                        arrMarkUP += "},";
                    }
                }
            });

            var lastindexp = arrPrice.lastIndexOf(",");
            arrPrice = arrPrice.substring(0, lastindexp) + "|";
            var lastindexm = arrMarkUP.lastIndexOf(",");
            arrMarkUP = arrMarkUP.substring(0, lastindexm) + "|";
            alert(arrPrice);
            alert(arrMarkUP);

            $("#hdPrice").val(arrPrice);
            $("#hdMarkUP").val(arrMarkUP);

            $("#AssignProductForm").submit();
        });

    });

我的JSON字符串由以上代码生成:

    {"Id":"1","Price":"4"},{"Id":"2","Price":"6"}

我的控制器解析代码:

    [HttpPost]
    public ActionResult AddProducts(FormCollection collection, string txtsearch)
    {
        var ManualPricing = collection["hdPrice"].Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);

         JavaScriptSerializer ser = new JavaScriptSerializer();
         var Manual = ser.Deserialize<PriceMargin>(ManualPricing[0]);         
    }

价格保证金是一个应该反序列化的类:

    public class PriceMargin
    {
        public string Id { get; set; }
        public string Price { get; set; }
    }

var Manual = ser.Deserialize<PriceMargin>(ManualPricing[0])给出了一个错误:

  

无效的JSON原语:{“Id”:“2”,“Price”:“9”}。

解决方案:

var list = new JavaScriptSerializer().Deserialize<List<KeyValue>>(json);

public class KeyValue
{
   public string key;
   public string value;
}

3 个答案:

答案 0 :(得分:1)

您的JSON无效。

JSON只能有一个根对象。

如果您想拥有多个对象,请序列化数组。

答案 1 :(得分:1)

要跟进评论,如果你想要一个对象数组,你可以这样做:

pricesArray = [];
$("table tr").each(function () {
  if ($(this).find('input:checkbox:first').is(':checked')) {
    var price = $(this).find('input.inputprice').val();
    var id = $(this).find('input[type=hidden]').val();
    pricesArray.push({Id : id, Price: price});
  }
});
// pricesArray [{"Id":"1","Price":"4"},{"Id":"2","Price":"6"}]

pricesArray现在应该包含您想要的数据,应该更容易序列化和解密数据并立即发送

答案 2 :(得分:0)

上次遇到这个错误时,我试图直接将对象值传递给json数据......即 data = {datavalue:@ Object.valueField};

在Json

$。AJAX({                 键入:&#34; POST&#34;,                 url:&#34; / Controller / FunctionToPostTo&#34;,                 数据:数据,                 contentType:&#34; application / json;字符集= UTF-8&#34 ;,                 dataType:&#34; html&#34;,                 成功:功能(响应){                     警报(&#39;成功&#39;);                 },                 失败:功能(响应){                     警报(&#39;故障&#39;);                     警报(response.responseText);                 },                 错误:函数(响应){                     警报(&#39;错误&#39);                     警报(response.responseText);                 }             });

解决问题我创建了一个单独的变量并为其赋值, 在Ajax中传递数据值我使用了JSON.stringify函数

var variableHolder = @ Object.valueField; data = {datavalue:variableHolder};

在Json

$。AJAX({                 键入:&#34; POST&#34;,                 url:&#34; / Controller / FunctionToPostTo&#34;,                 data:JSON.stringify(data),                 contentType:&#34; application / json;字符集= UTF-8&#34 ;,                 dataType:&#34; html&#34;,                 成功:功能(响应){                     警报(&#39;成功&#39;);                 },                 失败:功能(响应){                     警报(&#39;故障&#39;);                     警报(response.responseText);                 },                 错误:函数(响应){                     警报(&#39;错误&#39);                     警报(response.responseText);                 }             });

然后问题消失了