我在我的 ASP.NET Web API 项目中使用 Entity Framework Code First table-per-hierarchy 。我的一个模型有一个 List 是层次结构的抽象基类的类型。
List<Dog> // (for example; with GoldenRetriever, BorderCollie, etc inheriting)
我正在尝试使用 Fiddler 测试将一些数据发布到我的 API 控制器。但是当我这样做时,我不知道如何表示 JSON。如果我尝试类似:
"Dogs":
[
{"Name":"Bud", "Age":"3"}
]
我得到错误:
“无法创建 Models.Dog 类型的实例。类型是接口或抽象类,无法实例化。”
在 JSON 中指定鉴别器也对我没有帮助。有人有想法么?谢谢!
编辑:解决方案
诀窍是在 JSON 字符串中使用 $type 属性。有关更多信息,请参阅mtbennett 在评论中建议的 此链接。
要启用使用 $type 属性,我需要将以下内容添加到 WebApiConfig.cs:
config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling
= TypeNameHandling.Auto;
然后在将 JSON 发布到 Fiddler 时,我添加了带有完整对象路径的 $type 属性:
{"$type":"Example.Models.Dogs.GoldenRetriever, Example.Models",
"Name":"Bud","Age":3}
为了弄清楚这种格式,我使用了 Snixtor 的建议来序列化对象并输出 JSON 字符串。杰出的!
我不确定这是否是最优雅的解决方案,因为它是JSON.NET 特定的,但它有效!