У меня есть List<ISomething>
в json-файле, и я не могу найти простой способ для десериализировать его, не используя TypeNameHandling.All
(который я не хочу/не могу использовать, потому что файлы JSON написаны вручную).Deserializing список интерфейсов с пользовательским JsonConverter?
Есть ли способ применить атрибут [JsonConverter(typeof(MyConverter))]
к ним? от списка вместо списка?
{
"Size": { "Width": 100, "Height": 50 },
"Shapes": [
{ "Width": 10, "Height": 10 },
{ "Path": "foo.bar" },
{ "Width": 5, "Height": 2.5 },
{ "Width": 4, "Height": 3 },
]
}
В этом случае Shapes
является List<IShape>
где IShape
представляет собой интерфейс с этими двумя реализаторов: ShapeRect
и ShapeDxf
.
Я уже создал JsonConverter подкласс, который загружает элемент как JObject, а затем проверяет, которые в режиме реального класса для загрузки данных на наличие или отсутствие собственности Path
:
var jsonObject = JObject.Load(reader);
bool isCustom = jsonObject
.Properties()
.Any(x => x.Name == "Path");
IShape sh;
if(isCustom)
{
sh = new ShapeDxf();
}
else
{
sh = new ShapeRect();
}
serializer.Populate(jsonObject.CreateReader(), sh);
return sh;
Как я могу применить этот JsonConverter в список?
Спасибо.
[ 'JsonPropertyAttribute.ItemConverterType'] (http://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonPropertyAttribute_ItemConverterType.htm) – kiziu
@kiziu спасибо! Я не мог найти его в google ... :( – TesX