【问题标题】:Invalid JSON primitive While parsing JSON in MVC Controller在 MVC 控制器中解析 JSON 时 JSON 原语无效
【发布时间】:2013-07-07 16:32:45
【问题描述】:

我正在我的 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]);         
    }

Price margin 是一个应该反序列化的类:

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

var Manual = ser.Deserialize&lt;PriceMargin&gt;(ManualPricing[0]) 行给了我一个错误:

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

解决方案:

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

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

【问题讨论】:

  • 为什么要手动构建字符串?您可以使用本机数据类型,然后将这些数据类型编码为 JSON strong 并将 JSON 字符串解码为本机数据类型
  • 我不知道该怎么做,我是 javascript 和 jquery 的新手!有什么例子吗?
  • 添加了使用 javascript 对象的示例

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


【解决方案1】:

您的 JSON 无效。

JSON 只能有一个根对象。

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

【讨论】:

    【解决方案2】:

    要跟进评论,如果您想要一个对象数组,您可以执行以下操作:

    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 现在应该包含您想要的数据,现在应该更容易序列化和反序列化您的数据并发送它

    【讨论】:

      【解决方案3】:

      上次遇到该错误时,我尝试将对象值直接传递给 json 数据...即

      data = { datavalue: @Object.valueField};
      

      在 Json 中

      $.ajax({
          type: "POST",
          url: "/Controller/FunctionToPostTo",
          data: data,
          contentType: "application/json; charset=utf-8",
          dataType: "html",
          success: function (response) {
              alert('Success');
          },
          failure: function (response) {
              alert('Failure');
              alert(response.responseText);
          },
          error: function (response) {
              alert('Error');
              alert(response.responseText);
          }
      });
      

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

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

      在 Json 中

      $.ajax({
          type: "POST",
          url: "/Controller/FunctionToPostTo",
          data: JSON.stringify(data),
          contentType: "application/json; charset=utf-8",
          dataType: "html",
          success: function (response) {
              alert('Success');
          },
          failure: function (response) {
              alert('Failure');
              alert(response.responseText);
          },
          error: function (response) {
              alert('Error');
              alert(response.responseText);
          }
      });
      

      然后问题就消失了

      【讨论】:

        猜你喜欢
        • 2014-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-01
        • 2017-06-23
        • 1970-01-01
        • 1970-01-01
        • 2012-08-11
        相关资源
        最近更新 更多