2010-10-11 74 views
2

我無法使用DataContractJsonSerializer類反序列化混合類型的JSON數組。我花了很多時間尋找解決方案,但我想我會繼續在這裏問。反序列化混合類型的JSON數組

基本上,我得到一個像下面的JSON字符串。我想要數組反序列化到一個列表中,其中位置0有一個Int32,位置1有一個字符串,位置2有我的自定義類的實例。

[ 
    2, 
    "Mr. Smith", 
    { 
     "num":169, 
     "name":"main street", 
     "state":66 
    } 
] 

如果我只是創建像這樣一個連載:但是在位置2的位置是1

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(List<object>)) 

我實際上是在位置0獲得一個Int32和字符串我只是得到一個空對象。

有誰知道我想要做甚麼可能嗎?我無法控制我正在使用的JSON的結構。如果可能,我希望在不使用第三方程序集的情況下完成此操作。

回答

2

你必須做一個類,再現JSON結構是這樣的:

[DataContract] 
public class MyClass { 
    [DataMember] 
    public int IntMember { get; set; } 
    [DataMember] 
    public string StringMember { get; set; } 
    [DataMember] 
    public MyType[] AllTypes { get; set;} 
} 

[DataContract] 
public class MyType { 
    [DataMember] 
    public int num { get; set; } 
    [DataMember] 
    public string name { get; set; } 
    [DataMember] 
    public int state { get; set;} 
} 

裝飾類和它的屬性與「DataContract」和「數據成員」屬性。然後在你的反序列化的代碼使用您在下面的例子中

var serializer = new DataContractJsonSerializer(typeof(MyClass)); 
System.IO.StringReader reader = new System.IO.StringReader(jsonData); 
System.IO.MemoryStream ms = new System.IO.MemoryStream(Encoding.Default.GetBytes(jsonData)); 
return serializer.ReadObject(ms) as MyClass; 
+0

這也是最初想到的。問題是像這樣的數組不會反序列化到一個類。序列化程序強制將其反序列化爲數組。當我嘗試這個時,我得到錯誤「期待狀態'元素'..遇到'文本'的名稱'',命名空間''。」 – Mike 2010-10-11 00:55:35

+0

請看看我最後的編輯。我忘了它是一組元素...... – Lorenzo 2010-10-11 00:58:32

+0

洛倫佐,感謝代碼示例。這似乎也不管用。這將生成一個int成員= 0的MyClass實例,其他兩個成員爲null。東西仍然缺失... – Mike 2010-10-11 03:12:38

1

麥克創建的類,

的問題是反序列化過程中,JSON解串器不知道什麼類型的位置反序列化元素2到。

您需要提供一個「__type」提示。你可以通過在一個多態的情況下將它序列化爲JSON來獲得特定類型的__type提示,並查看發出了什麼類型的提示。

欲瞭解更多信息,請參閱http://msdn.microsoft.com/en-us/library/bb412170.aspx。要特別注意「分配給對象的集合」和「保存類型信息」部分