2010-11-16 9 views
5

que tienen el siguiente modelo:¿Cómo deserializar un diccionario utilizando 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; } 
} 

Ahora, por alguna razón desconocida, DataContractJsonSerializer can't deserialize JSON into a dictionary (Ver sección de detalles adicionales).
Desafortunadamente DataContractJsonSerializer también está sellado por razones que están más allá de mí.
Necesito una forma de evitarlo, ¿alguien tiene una pista?

Respuesta

5

Dado que no hay un tipo de diccionario en JavaScript, es bastante difícil tener JSON deparse en uno. Lo que vas a tener que hacer es escribir un convertidor tú mismo.

Sin embargo, eso también es cierto en la mayoría de los objetos de serialización personalizados, así que con suerte eso no es una gran sorpresa.

Ahora, sin embargo, debería leerlo como KeyValuePair para que pueda probarlo, para ver si le está deserializando al menos. Por el contrario, se necesitaría una List<KeyValuePair<>>

Qué Dictionary<string,string> se traduce en 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"}] 

La misma asociativo de JavaScript en JSON:

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

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

Así que no hay problema en pocas palabras.


Unos enlaces de seguimiento de utilidad

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

Por qué no puede DataContractJsonSerializer serializar el diccionario como: Diccionario [ "ObjectName"] = Valor; –

+0

Además, CollectionDataContractAttribute no se aplica a DataContractJsonSerializer, nuevamente sin ningún motivo. Sobre el primer enlace, ¿qué hago si no tengo JavaScriptSerializer porque es una DLL Web? –

+0

ya que es un dll 'Web' ¿No entiendo? Puede usar cualquier biblioteca en .NET GAC simplemente haciendo referencia a ella. Ese es el poder de la biblioteca .NET. El hecho de que esté en System.Web o lo que sea, eso no significa nada. Es solo un espacio de nombres para la organización lógica de objetos, métodos y similares. Y en cuanto a _¿Por qué DCJS no puede serializar el diccionario de esa manera_, idk, pero te he mostrado el problema anterior? – jcolebrand

Cuestiones relacionadas