2016-12-05 2 views
1

У меня есть 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 в список?

Спасибо.

+2

[ 'JsonPropertyAttribute.ItemConverterType'] (http://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonPropertyAttribute_ItemConverterType.htm) – kiziu

+0

@kiziu спасибо! Я не мог найти его в google ... :( – TesX

ответ

1

В вашем классе, вы можете пометить свой список с атрибутом JsonProperty и указать ваш конвертер с ItemConverterType параметра:

class Foo 
{ 
    public Size Size { get; set; } 

    [JsonProperty(ItemConverterType = typeof(MyConverter))]   
    public List<IShape> Shapes { get; set; } 
} 

В качестве альтернативы, вы можете передать экземпляр вашего преобразователя в JsonConvert.DeserializeObject, если вы реализовали CanConvert такой, что он возвращает true, когда objectType == typeof(IShape). Json.Net затем применит конвертер к элементам списка.

Смежные вопросы