Десериализовать значения словаря JSON с помощью JsonConverter

c# json json.net

1354 просмотра

2 ответа

10794 Репутация автора

Я использую библиотеку Json.NET для десериализации JSON. Для абстрактного класса у Fooменя есть обычай JsonConverter. Вот как я это использовал:

[JsonConverter(typeof(FooJsonConverter))]
public Foo MyFoo { get; set; }

Все идет нормально. Проблема возникает, когда я использую класс Foo в словаре. Это была моя попытка:

[JsonDictionary(ItemConverterType = typeof(FooJsonConverter))]
public Dictionary<string, Foo> MyFooDictionary { get; set; }

Но вышесказанное дает ошибку:

Атрибут 'JsonDictionary' недопустим в этом типе объявления. Он действителен только для объявлений класса, интерфейса.

Как указать конвертер для значения словаря?

Автор: holmis83 Источник Размещён: 12.11.2015 03:12

Ответы (2)


3 плюса

88657 Репутация автора

Решение

Используйте [JsonProperty]вместо [JsonDictionary].

[JsonProperty(ItemConverterType = typeof(FooJsonConverter))]
public Dictionary<string, Foo> MyFooDictionary { get; set; }

Скрипка: https://dotnetfiddle.net/QJCtBg

Другой вариант - добавить конвертер в JsonSerializerSettingsи передать его JsonConvert.DeserializeObject.

var settings = new JsonSerializerSettings();
settings.Converters.Add(new FooJsonConverter());

var obj = JsonConvert.DeserializeObject<ObjType>(json, settings);
Автор: Brian Rogers Размещён: 12.11.2015 03:23

-1 плюса

5304 Репутация автора

Добавьте атрибут в ваш класс Foo. Вероятно, это связано с тем, что ваш словарь может содержать два разных типа, а атрибут не будет знать, на какой из них вы ссылаетесь.

[JsonDictionary(ItemConverterType = typeof(FooJsonConverter))]
public class Foo
{

    ...

}
Автор: Praveen Paulose Размещён: 12.11.2015 03:27
32x32