Я использую Entity Framework Code Сначала table-per-hierarchy в моем проекте ASP.NET Web API. Одна из моих моделей имеет список, который относится к типу абстрактного базового класса иерархии.Как JSON.NET сериализует объекты при использовании EF table-per-hierarchy?
List<Dog> // (for example; with GoldenRetriever, BorderCollie, etc inheriting)
Я пытаюсь протестировать POSTing некоторые данные в свой контроллер API с помощью Fiddler. Но я не знаю, как представлять JSON, когда я это делаю. Если я пытаюсь что-то вроде:
"Dogs":
[
{"Name":"Bud", "Age":"3"}
]
Я получаю ошибку:
"Could not create an instance of type Models.Dog. Type is an interface or abstract class and cannot be instantiated."
Указания Дискриминатора в формате JSON не помогает мне тоже. У кого-нибудь есть идеи? Благодаря!
Edit: Решение
Хитрость заключается в том, чтобы использовать свойство $ типа в строку JSON. Для получения дополнительной информации см. this link, предложенный m.t.bennett в комментариях.
Чтобы включить с помощью свойства $ типа мне нужно добавить следующее WebApiConfig.cs:
config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling
= TypeNameHandling.Auto;
Затем при проводке JSON к Скрипач, я добавил свойство $ типа с указанием полного пути объекта:
{"$type":"Example.Models.Dogs.GoldenRetriever, Example.Models",
"Name":"Bud","Age":3}
Для того, чтобы понять это форматирование, я использовал предложение Snixtor для сериализации объекта и вывода строки JSON. Brilliant!
Я не уверен, что это самое элегантное решение, так как оно JSON.NET specific, но оно работает!
я найти лучший способ для определения JSON форматирования для модели сериализовать существующий экземпляр * до * JSON. Вы пробовали это? – Snixtor
@Snixtor Большой совет (и будет использовать его в будущем), но это не помогло. Я использовал JsonConvert для сериализации списка, и он выплюнул в основном то, что я уже пытался. Не было никаких признаков дискриминации между типами объектов. – brudert
делает эту ссылку http://stackoverflow.com/questions/6348215/how-to-deserialize-json-into-ienumerablebasetype-with-newtonsoft-json-net вообще? –