我在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"}]"
答案 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);
}