Json.NET: десериализация вложенных словарей - PullRequest
29 голосов
/ 20 июня 2011

При десериализации объекта в Dictionary (JsonConvert.DeserializeObject<IDictionary<string,object>>(json)) вложенные объекты десериализуются до JObject с. Можно ли заставить десериализовать вложенные объекты до Dictionary с?

Ответы [ 2 ]

40 голосов
/ 21 июня 2011

Я нашел способ преобразовать все вложенные объекты в Dictionary<string,object>, предоставив реализацию CustomCreationConverter:

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

Документация: CustomCreationConverter с Json.NET

1 голос
/ 01 июля 2013

Alternative / Update:

Мне нужно было десериализовать словарь словарей String s, и с текущей версией Json.NET (5.0) мне не пришлось создавать CustomConverter, я просто использовал (в VB.Net):

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

Или в C #:

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