无法将javascript对象数组反序列化为C#数组

时间:2015-04-08 07:13:40

标签: c# json json-deserialization

我在javascript中建立一个对象数组,如下所示:

var tabDiscount = []
for(var i=0; i<someArray.length; i++){
  var refdiscountpair = { productCode: $("#Ref" + i).html(), discount: discountValue }
  tabDiscount.push(refdiscountpair);
}

似乎工作正常。然后我将这个数组存储在一个hiddefield

$HFDiscount.val(JSON.stringify(tabDiscount));

所以当表单发布时,我得到了服务器端的hiddenfield值。我有一个C#类RefDiscountPair:

 [Serializable]
    public class RefDiscountPair
    {
        public string productCode
        {
            get;
            set;
        }

        public int discount
        {
            get;
            set;
        }

        public RefDiscountPair()
        {
        }
    }

我尝试将javascript对象的数组反序列化为RefDiscountPair数组。我尝试过使用JSON .NET包(Newtonsoft.Json):

RefDiscountPair[] test = JsonConvert.DeserializeObject<RefDiscountPair[]>(HFDiscount.Value);

whcih提出JsonSerializationException

我还尝试使用JavaScriptSerializer类:

string[] test = js.Deserialize<string[]>(js.Deserialize<string>(HFDiscount.Value));
foreach (string s in test)
{
   RefDiscountPair p = js.Deserialize<RefDiscountPair>(s);
}

异常

  

MissingMethodException(没有为&#39; system.string&#39;。javascriptserializer的类型定义无参数构造函数。)

有什么想法吗?

修改

这是我收到的JSON的结构:

"\"[{\\\"productCode\\\": \\\"1111111\\\", \\\"discount\\\": \\\"5\\\"}, {\\\"productCode\\\": \\\"2222222\\\", \\\"discount\\\": \\\"5\\\"}]\""

导致以下错误消息:

Error converting value "[{"productCode": "1111111", "discount": "5"}, {"productCode": "2222222", "discount": "5"}]"

4 个答案:

答案 0 :(得分:1)

您不需要多次反序列化,只尝试将其转换为对象列表:

js.Deserialize<List<RefDiscountPair>>(HFDiscount.Value));

但请确保hiddenfield中的JSON字符串是正确的。如果你在这种情况下得到任何异常,那么应该尝试在javascript中修复JSON字符串,或者在去序列化之前删除代码中的一些其他字符

修改

肯定你的JSON字符串不正确,你必须改变它。你可以用JS代码或C#做。如果你想在后面的代码中修复它,你可以使用下面的代码:

var jsonStr = "\"[{\\\"productCode\\\": \\\"1111111\\\", \\\"discount\\\": \\\"5\\\"}, {\\\"productCode\\\": \\\"2222222\\\", \\\"discount\\\": \\\"5\\\"}]\"";
if (jsonStr.StartsWith("\""))
    jsonStr = jsonStr.Substring(1);
if(jsonStr.EndsWith("\""))
    jsonStr = jsonStr.Substring(0 , jsonStr.Length-1);    

jsonStr = jsonStr.Replace("\\", "");

var serializer = new JavaScriptSerializer();

serializer.Deserialize<List<RefDiscountPair>>(jsonStr);

我对此进行了测试,并且工作正常

答案 1 :(得分:1)

首先,您需要检查您的JSON是否正确。 HFDiscount.Value属性应包含类似的内容(结构,而不是值):

[  
   {  
      "productCode":"535854302-3",
      "discount":11
   },
   {  
      "productCode":"905491934-5",
      "discount":6
   }
]

对于反序列化,我建议你使用JSON.Net(你的第一次尝试)。您不需要为您的模型设置Serialization属性和默认构造函数:

public class RefDiscountPair
{
    public string ProductCode { get; set; }
    public int Discount { get; set; }
}

现在您可以轻松地反序列化JSON:

var refDiscountPairs = 
    JsonConvert.DeserializeObject<IList<RefDiscountPair>>(HFDiscount.Value);

编辑:您的JSON存在一些问题。我创建了一个简单的演示,它运行良好。我使用过的模型:

public class IndexModel
{
    public string HFDiscount { get; set; }
}

CSHTML:

@using (Html.BeginForm("Index", "Home"))
{
    @Html.HiddenFor(m => m.HFDiscount)
    <button type="submit">Submit</button>
}

使用Javascript:

var tabDiscount = [];
for (var i = 0; i < 2; i++) {
    var refdiscountpair = { productCode: "code" + i, discount: i }
    tabDiscount.push(refdiscountpair);
}
$("#HFDiscount").val(JSON.stringify(tabDiscount));

和控制器方法:

[HttpPost]
 public ActionResult Index(IndexModel model)
 {
     var refDiscountPairs = JsonConvert.DeserializeObject<IList<RefDiscountPair>>(model.HFDiscount);
     return View();
 }

编辑:事实证明您实际上使用的是纯ASP.NET。我也尝试过,效果很好。

ASPX:

<asp:HiddenField ID="HFDiscount" ClientIDMode="Static" runat="server" />
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_OnClick" />

代码隐藏:

protected void Button1_OnClick(object sender, EventArgs e)
{
    var refDiscountPairs =
        JsonConvert.DeserializeObject<IList<RefDiscountPair>>(HFDiscount.Value);
}

您需要验证所有步骤并找到JSON损坏的位置。从检查浏览器中的隐藏字段值开始。

答案 2 :(得分:0)

   string jsonInput = "Your json STRING";

                    Newtonsoft.Json.Linq.JContainer resp = (Newtonsoft.Json.Linq.JContainer)JsonConvert.DeserializeObject(jsonInput);
                    foreach (JObject str in resp)
                    {
                        JsonSerializer serializer = new JsonSerializer();

                        YourObject p = (YourObject)serializer.Deserialize(new JTokenReader(str), typeof(YourObject));
                        YourObjectAsListOfObject.Add(p);
                    }

答案 3 :(得分:0)

你的json有些问题。

以下是一个工作示例:Demo

代码:

// you can generate your class with http://json2csharp.com/
public class RefDiscountPair
{
    public string ProductCode { get; set; }
    public int Discount { get; set; }
}

public void Main()
{
    string json = "[{\"productCode\": \"1111111\", \"discount\": \"5\"}, {\"productCode\": \"2222222\", \"discount\": \"5\"}]";

    var m = JsonConvert.DeserializeObject<List<RefDiscountPair>>(json);

    Console.WriteLine(m[0].Discount);
}