6

我有一個js對象結構類似:JavaScriptSerializer反序列化對象「收藏」爲對象的屬性沒有

object.property1 = "some string"; 
object.property2 = "some string"; 
object.property3.property1 = "some string"; 
object.property3.property2 = "some string"; 
object.property3.property2 = "some string"; 

即時透過JSON.stringify(對象)與Ajax請求通過這個。當我嘗試使用JavaScriptSerializer.Deserialize作爲字典反序列化時,我得到以下錯誤:

沒有爲'System.String'類型定義的無參數構造函數。

這個完全相同的過程是工作與非「集合」屬性的常規對象..感謝您的任何幫助!

回答

9

這是因爲反序列化器不知道如何處理子對象。你在JS這是什麼:

var x = { 
    'property1' : 'string', 
    'property2' : 'string', 
    'property3' : { p1: 'string', p2: 'string', p3: 'string' }, 
}; 

不有地圖在C#中的東西有效:

HashTable h = new HashTable(); 
h.Add("property1", "string"); 
h.Add("property2", "string"); 
h.Add("property3", ???); 

的???是因爲這裏沒有定義類型,那麼反序列化器怎麼知道你的JS中的匿名對象代表什麼?

編輯

有沒有辦法做你試圖在這裏完成的。你需要讓你的對象輸入。例如,像這樣定義你的班級:

class Foo{ 
    string property1 { get; set; } 
    string property2 { get; set; } 
    Bar property3 { get; set; } // "Bar" would describe your sub-object 
} 

class Bar{ 
    string p1 { get; set; } 
    string p2 { get; set; } 
    string p3 { get; set; } 
} 

......或者是那個效果。

+0

這是我原來的問題的一個很好的闡述..你有答案嗎?謝謝! – bill 2010-06-02 17:14:15

+0

好吧,這是有道理的,是最簡單的..一旦我輸入他們如何我反序列化整個事情呢? – bill 2010-06-02 18:39:30

+1

我不熟悉JavaScriptSerializer,但我猜測:Foo foo = JavaScriptSerializer.Deserialize (incomingJson); – jvenema 2010-06-02 20:31:51

0

作爲一個更普遍的答案,在我來說,我有一個看起來像對象:

{ "field1" : "value", "data" : { "foo" : "bar" } } 

我本來的數據字段作爲一個字符串時,它應該已經是一個Dictionary<string, string>作爲對象上MSDN指定使用字典語法。

public class Message 
{ 
    public string field1 { get; set; } 

    public Dictionary<string, string> data { get; set; } 
}