2011-06-20 11 views
22

Podczas przekształcania obiektu w postać szeregową na Dictionary (JsonConvert.DeserializeObject<IDictionary<string,object>>(json)) zagnieżdżone obiekty są przekształcane w postaci szeregowej na JObject s. Czy można wymusić deserializację obiektów zagnieżdżonych na Dictionary s?Json.NET: Deserializowanie zagnieżdżonych słowników

Odpowiedz

32

znalazłem sposób na konwersję wszystkich obiektów zagnieżdżonych do Dictionary<string,object> dostarczając CustomCreationConverter realizacji:

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()}); 
    } 
} 

Dokumentacja: CustomCreationConverter with Json.NET

-1

Alternative/Aktualizacja:

Musiałem deserializowania słownik słowników String s oraz z obecnym Json.NET (5.0) Nie musiałem tworzyć CustomConverter, I jus T wykorzystywane (w Vb.NET)

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

A, C#:

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

nie obsługuje rekurencyjne/nieznany struktury json właściwie konwersji. –

+0

To nie odpowiada, ponieważ odnosi się konkretnie do ustalonych poziomów zagnieżdżania – Javier

Powiązane problemy