Подтвердить что ты не робот

Json.NET: десериализация вложенных словарей

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

4b9b3361

Ответ 1

Я нашел способ преобразовать все вложенные объекты в 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

Ответ 2

Alternative/Update:

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

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

Или, в С#:

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