2011-06-20 25 views
22

Al deserializar un objeto a Dictionary (JsonConvert.DeserializeObject<IDictionary<string,object>>(json)) los objetos anidados se deserializan a JObject s. ¿Es posible forzar que los objetos anidados se deserialicen a Dictionary s?Json.NET: deserializar diccionarios anidados

Respuesta

32

he encontrado una manera de convertir todos los objetos anidados para Dictionary<string,object> proporcionando un CustomCreationConverter aplicación:

class MyConverter : CustomCreationConverter<IDictionary<string, object>> 
{ 
    public override IDictionary<string, object> Create(Type objectType) 
    { 
     return new Dictionary<string, object>(); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     // in addition to handling IDictionary<string, object> 
     // we want to handle the deserialization of dict value 
     // which is of type object 
     return objectType == typeof(object) || base.CanConvert(objectType); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.TokenType == JsonToken.StartObject 
      || reader.TokenType == JsonToken.Null) 
      return base.ReadJson(reader, objectType, existingValue, serializer); 

     // if the next token is not an object 
     // then fall back on standard deserializer (strings, numbers etc.) 
     return serializer.Deserialize(reader); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var json = File.ReadAllText(@"c:\test.json"); 
     var obj = JsonConvert.DeserializeObject<IDictionary<string, object>>(
      json, new JsonConverter[] {new MyConverter()}); 
    } 
} 

Documentación: CustomCreationConverter with Json.NET

-1

Alternativa/actualización:

que necesitaba para deserializar una diccionario de diccionarios de String sy con Json.NET actual (5.0) No tuve que crear un CustomConverter, I jus t utiliza (en VB.Net):

JsonConvert.DeserializeObject(Of IDictionary(Of String, IDictionary(Of String, String)))(jsonString) 

O, en C#:

JsonConvert.DeserializeObject<IDictionary<String, IDictionary<String, String>>(jsonString); 
+1

Esto no es compatible con las estructuras JSON recursivas/desconocidos siendo convertidos correctamente. –

+0

Esto no responde, ya que se refiere específicamente a un nivel fijo de anidación – Javier

Cuestiones relacionadas