2010-11-16 15 views
5

Mam następujący model:Jak deserializować słownik przy użyciu 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; } 
} 

Teraz dla jakiegoś nieznanego powodu, DataContractJsonSerializer can't deserialize JSON into a dictionary (Patrz dodatkową sekcję szczegóły).
Niestety DataContractJsonSerializer jest również zapieczętowany z powodów, które są poza mną.
Potrzebuję sposobu na obejście tego, czy ktoś ma wskazówkę?

Odpowiedz

5

Ponieważ nie ma słownika w javascriptie, trudno jest JSON wrzucić go do jednego. To, co musisz zrobić, to napisać sam konwerter.

Jednak jest tak również w przypadku większości niestandardowych obiektów serializacji, więc mam nadzieję, że nie będzie to niespodzianką.

Teraz jednak należy go odczytywać jako KeyValuePair, aby można było spróbować, aby sprawdzić, czy jest to co najmniej deserializacja dla Ciebie. Raczej byś potrzebował List<KeyValuePair<>>

Co Dictionary<string,string> przekłada się na 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"}] 

To samo asocjacyjną z javascript do JSON:

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

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

Więc nie ma problemu w pigułce.


Kilka linki nawiązanie do przydatności

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

Dlaczego nie można DataContractJsonSerializer serializacji słownika jako: Słownik [ "ObjectName"] = wartość; –

+0

Ponadto metoda CollectionDataContractAttribute nie ma zastosowania do DataContractJsonSerializer, ponownie bez żadnego powodu. O pierwszym linku, co mam zrobić, jeśli nie mam JavaScriptSerializer, ponieważ jest to biblioteka DLL. –

+0

, ponieważ jest to 'Web' dll? Nie rozumiem? Możesz użyć dowolnej biblioteki w .NET GAC, po prostu przez odwołanie się do niej. Taka jest moc biblioteki .NET. Tylko dlatego, że jest w System.Web lub czymkolwiek, to nic nie znaczy. To tylko przestrzeń nazw dla logicznej organizacji obiektów, metod i tym podobnych. A co do _Dlaczego DCJS nie może serializować słownika w ten sposób? Idk, ale pokazałem ci powyższy problem. – jcolebrand

Powiązane problemy