2010-11-16 43 views
5

我有以下型號:如何使用DataContractJsonSerializer反序列化字典?

[DataContract] 
public class MessageHeader 
{ 
    private Guid? messageId; 

    public Guid MessageId 
    { 
     get 
     { 
      if (messageId == null) 
       messageId = Guid.NewGuid(); 

      return messageId.Value; 
     } 
    } 

    [DataMember] 
    public string ObjectName { get; set; } 

    [DataMember] 
    public Dictionary<string, object> Parameters { get; set; } // Can't deserialize this 

    [DataMember] 
    public Action Action { get; set; } 

    [DataMember] 
    public User InitiatingUser { get; set; } 
} 

現在對於一些未知的原因,DataContractJsonSerializer can't deserialize JSON into a dictionary(見額外的細節部分)。
不幸的是,DataContractJsonSerializer也因爲我無法理解的原因而被密封。
我需要一種方法來解決它,有沒有人有線索?

回答

5

由於JavaScript中沒有字典類型,因此很難將JSON解析爲一個字典。你將不得不做的是自己寫一個轉換器。

但是,大多數自定義序列化對象也是如此,所以希望沒有什麼大的驚喜。

但是,現在它應該作爲KeyValuePair讀入,以便您可以嘗試一下,看看它是否至少對您進行了反序列化。相反,你需要一個List<KeyValuePair<>>

什麼Dictionary<string,string>轉化成JSON:

var dict = new Dictionary<string,string>; 
dict["Red"] = "Rosso"; 
dict["Blue"] = "Blu"; 
dict["Green"] = "Verde"; 

[{"Key":"Red","Value":"Rosso"}, 
{"Key":"Blue","Value":"Blu"}, 
{"Key":"Green","Value":"Verde"}] 

同聯想從JavaScript到JSON:

var a = {}; 
a["Red"] = "Rosso"; 
a["Blue"] = "Blu"; 
a["Green"] = "Verde"; 

{"Red":"Rosso","Blue":"Blu","Green":"Verde"} 

所以這是概括地說這個問題。


爲有用的一些後續鏈接

http://my6solutions.com/post/2009/06/17/The-serialization-and-deserialization-of-the-generic-Dictionary-via-the-DataContractJsonSerializer.aspx

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.collectiondatacontractattribute.aspx

+0

爲什麼不能DataContractJsonSerializer序列化詞典爲:詞典[ 「的ObjectName」] =值; – 2010-11-17 05:45:00

+0

此外,CollectionDataDataContractAttribute不適用於DataContractJsonSerializer,再次絕對沒有理由。關於第一個鏈接,如果我沒有JavaScriptSerializer,我該怎麼做,因爲它是一個Web DLL。 – 2010-11-17 06:01:36

+0

因爲它是一個'Web' DLL?我不明白?只需引用它即可使用.NET GAC中的任何庫。這是.NET庫的強大功能。只是因爲它在System.Web或其他什麼,這並不意味着什麼。它只是一個用於邏輯組織對象,方法等的命名空間。至於_Why爲什麼不能DCJS序列化這個way_,idk字典,但是我已經向你展示了上面的問題。 – jcolebrand 2010-11-17 15:53:01

相關問題