2

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<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;
}
4

3 に答える 3

1

JSON が無効です。

JSON は単一のルート オブジェクトのみを持つことができます。

複数のオブジェクトが必要な場合は、配列をシリアル化します。

于 2013-07-07T16:34:25.437 に答える
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必要なデータが含まれるようになりました。データをシリアル化および逆シリアル化し、今すぐ送信するのがはるかに簡単になるはずです

于 2013-07-07T16:39:56.347 に答える