2010-11-16 15 views
5

Ich habe folgendes Modell:Wie ein Wörterbuch mit DataContractJsonSerializer deserialisieren?

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

Jetzt aus einem unbekannten Grund, DataContractJsonSerializer can't deserialize JSON into a dictionary (Siehe weitere Einzelheiten Abschnitt).
Leider ist DataContractJsonSerializer auch aus Gründen versiegelt, die über mich hinausgehen.
Ich brauche einen Weg, um es zu umgehen, hat jemand eine Ahnung?

Antwort

5

Da es in Javascript kein Wörterbuchtyp gibt, ist es ziemlich schwierig, JSON in einem zu unterscheiden. Was Sie tun müssen, ist einen Konverter selbst zu schreiben.

Das gilt jedoch auch für die meisten benutzerdefinierten Serialisierungsobjekte, so dass dies hoffentlich keine große Überraschung ist.

Nun sollte es jedoch als KeyValuePair eingelesen werden, damit Sie das ausprobieren können, um zu sehen, ob es zumindest für Sie deserialisiert. Vielmehr müssten Sie ein List<KeyValuePair<>>

Was für ein Dictionary<string,string> in für JSON übersetzt:

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"}] 

Das gleiche assoziative von Javascript in JSON:

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

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

So gibt es das Problem auf den Punkt.


Einige Followup-Links für Nützlichkeit

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

Warum kann DataContractJsonSerializer das Wörterbuch als serialisiert: Dictionary [ "ObjektName"] = Wert; –

+0

Auch CollectionDataContractAttribute gilt nicht für DataContractJsonSerializer erneut aus absolut keinem Grund. Über den ersten Link, was mache ich, wenn ich JavaScriptSerializer nicht habe, da es eine Web DLL ist. –

+0

da es eine 'Web' DLL ist? Ich verstehe nicht? Sie können jede Bibliothek in der .NET-GAC verwenden, indem Sie darauf verweisen. Das ist die Stärke der .NET-Bibliothek. Nur weil es in System.Web oder was auch immer ist, bedeutet das nichts. Es ist nur ein Namensraum für die logische Organisation von Objekten, Methoden und dergleichen. Und warum kann DCJS das Wörterbuch nicht auf diese Weise serialisieren, IDK, aber ich habe Ihnen das obige Problem gezeigt. – jcolebrand

Verwandte Themen