2015-04-08 82 views
0

我對象bulding的一個數組在JavaScript如下:無法反序列化對象的JavaScript數組到C#陣列

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

這似乎很好地工作。然後我將這個數組存儲在一個隱藏域中

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

所以當表單發佈時,我得到隱藏域值服務器端。我有一個C#類RefDiscountPair:

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

     public int discount 
     { 
      get; 
      set; 
     } 

     public RefDiscountPair() 
     { 
     } 
    } 

我嘗試javascript對象陣列反序列化爲RefDiscountPair的陣列。

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

whcih提出了一個JsonSerializationException:我使用JSON .NET包(Newtonsoft.Json)嘗試。

我也試着使用JavaScriptSerializer類:

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

異常

MissingMethodException(類型的 'system.string' javascriptserializer沒有定義參數的構造函數)。

任何想法?

編輯

這是我收到的JSON的結構:

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

這導致以下錯誤信息:

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

所以你得到的JSON它看起來像 {項目:yourArray}這可能是更好的保鮮膜包裝對象中的數組 –

+1

您是否嘗試過反序列化一個對象,而不是一個數組?嘗試限制可能出錯的事物的數量。 –

+0

@ A.Rama使用JSON.NET包將一個對象放入RefDiscountPair對象看起來可以正常工作。我不明白爲什麼我不能將整個數組反序列化到C#中的RefDiscountPair數組中。 – WizLiz

回答

1

你並不需要多個反序列化,只嘗試將其轉換爲對象列表:

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

但請確保隱藏字段中的JSON字符串是正確的。如果在這種情況下得到任何異常,則應該嘗試修復JavaScript中的JSON字符串或desrialize之前刪除代碼中的一些附加的字符是

編輯:

絕對是您的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); 

我試用了它的正常工作

+0

我得到一個異常無法將類型爲string的對象轉換爲類型爲List的對象。你的意思是修理JSON嗎? Hiddefield值確實表示對象數組的JSON字符串,並且似乎是正確的。除了JSON.stringify(array),我還能做什麼? – WizLiz

+0

你可以發佈JSON字符串嗎? – Peyman

+0

它在我最後的編輯 – WizLiz

1

第一件事情你需要檢查,如果你的JSON是正確的。 HFDiscount.Value屬性應包含類似的東西(結構,而不是值):

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

反序列化,我建議你使用JSON。網絡(你的第一次嘗試)。你並不需要有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(); 
} 

編輯:原來是Y ou實際上使用純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被損壞的地方。從檢查瀏覽器中隱藏的字段值開始。

+0

我編輯我的問題,以顯示我收到什麼樣的JSON,也許這將有助於我得到像以前一樣的異常。 – WizLiz

+0

我在答案中增加了更多的例子。 –

+0

順便說一句,你使用MVC或其他框架? –

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