C# Web Api控制器方法中具体类的反序列化接口
我正在用asp.net编写一个web api。 我有以下问题: 我有一个接口和一个实现该接口的类C# Web Api控制器方法中具体类的反序列化接口,c#,asp.net,json.net,asp.net-web-api2,C#,Asp.net,Json.net,Asp.net Web Api2,我正在用asp.net编写一个web api。 我有以下问题: 我有一个接口和一个实现该接口的类 public interface Item { string Name { get; set; } string Description { get; set; } } public class ConcreteItem : ITem { public ConcreteItem() { } string Name { get; set; }
public interface Item
{
string Name { get; set; }
string Description { get; set; }
}
public class ConcreteItem : ITem
{
public ConcreteItem()
{
}
string Name { get; set; }
string Description { get; set; }
}
在我的控制器类中,我有以下方法
[HttpPost]
public IHttpActionResult ByGivenItems([FromBody] IEnumerable<Item> items)
{
//Do something here
}
[HttpPost]
按给定项([FromBody]IEnumerable items)列出的公共IHttpActionResult
{
//在这里做点什么
}
问题是当我将一些内容发送到webservice(json格式)时。
如果我有下面的签名,那么数组是空的
public IHttpActionResult ByGivenItems([FromBody] IEnumerable<Item> items)
public ihttpackationresult by givenitems([FromBody]IEnumerable items)
但是换成
public IHttpActionResult ByGivenItems([FromBody] IEnumerable<ConcreteItem> items)
public ihttpackationresult by givenitems([FromBody]IEnumerable items)
工作。
我应该怎么做才能让json转换器将其反序列化为正确的类型?
我是C#世界的新手,所以我需要一个很好的解释
我已经通过邮递员发送了一些数据对它进行了测试。你希望它做什么?它无法创建
接口
的实例,您要求它将JSON反序列化为IEnumerable
,而项
无法实例化,这意味着它必须猜测可以实例化到哪个类项
,如果有两个相同的ConcreteItem
类,会发生什么?它如何选择使用哪一个?看起来非常相似。这回答了你的问题吗?我知道我需要序列化为具体类型。但我的问题是如何在asp.NETWebAPI系统中实现它,因为框架是所有工作的主要部分。我可以说将json converter转换为具体项,但保留givenitems([FromBody]IEnumerable items)方法的签名吗?链接的问题表明,[JsonConverter]
属性可以应用于接口。您还可以将转换器添加到序列化设置中,如中所示。@mimi您可以尝试查看自定义模型绑定。现在,按照惯例,控制器操作不应该以接口作为参数,原因与前面提到的相同,但是您可以使用模型绑定器,自己获取原始输入并反序列化它,您希望它做什么?它无法创建接口
的实例,您要求它将JSON反序列化为IEnumerable
,而项
无法实例化,这意味着它必须猜测可以实例化到哪个类项
,如果有两个相同的ConcreteItem
类,会发生什么?它如何选择使用哪一个?看起来非常相似。这回答了你的问题吗?我知道我需要序列化为具体类型。但我的问题是如何在asp.NETWebAPI系统中实现它,因为框架是所有工作的主要部分。我可以说将json converter转换为具体项,但保留givenitems([FromBody]IEnumerable items)方法的签名吗?
链接的问题表明,[JsonConverter]
属性可以应用于接口。您还可以将转换器添加到序列化设置中,如中所示。@mimi您可以尝试查看自定义模型绑定。现在,按照惯例,控制器操作不应该以接口作为参数,原因与前面提到的相同,但是您可以使用模型绑定器,自己获取原始输入并反序列化它