我正在向我的.net core 3 web API应用程序上的控制器传递一个有效的JSON对象。这样做时,我得到错误:
System.NotSupportedException:不支持接口类型的初始化。类型“OrderTranslationContracts.OrderContracts+IImportOrderLineModel”
所以我看了我的代码,我有下面的接口的具体实现。这里是我认为抛出错误的行:
public List<OrderContracts.IImportOrderLineModel> Lines { get; set; }
字符串
下面是我传递到控制器的JSON部分:
"lines": [
{
"orderNumber": "LV21131327",
"lineNumber": 1,
"itemId": "3083US",
"customerItemId": "3083US",
"quantity": 3,
"price": 0.00,
"quantityBackOrdered": null,
"comments": "",
"pickLocation": "",
"orderFilled": "O",
"hostUom": null,
"type": null
}
型
所以我知道JSON是有效的。下面是控制器的签名:
[HttpPost]
public async Task<List<ImportOrderModel>> Post([FromBody] List<ImportOrderModel> orders)
{
var response = await _validateOrder.ValidateAllOrdersAsync(orders, null);
return response;
}
型
我甚至没有打断这段代码,因为我假设JSON转换器在试图转换它时抛出了错误。那么我如何克服这个错误呢?我受接口的具体实现的约束,所以我不能改变接口,如果可能的话,我需要使用这里的接口。如果这是不可能的,有没有什么“变通办法”?
4条答案
按热度按时间pb3skfrl1#
我遇到了与
HttpClient.GetFromJsonAsync
相同的问题,我尝试了httpClient.GetFromJsonAsync<ICustomer>(url);
我得到了错误:
使用System.Text.JSON不支持接口类型的初始化
从我所能发现的来看,一个模型必须可以用来对一个接口类型进行描述。我的解决方案是使用数据注解在接口中定义模型。
1.创建一个TypeConverter(我在这里找到了这个类:Casting interfaces for deserialization in JSON.NET)
using Newtonsoft.json;
字符串
2在接口中添加数据注解(
[JsonConverter(typeof(ConcreteTypeConverter<AddressModel>))]
)型
3不幸的是
HttpClient.GetFromJsonAsync
没有使用Newtonsoft。我自己写了方法型
4现在我可以用途:
型
ui7jx7zq2#
我也是在收到一个异常后看到这篇文章的,但是发现使用属性有点适得其反。使用接口的全部原因是这些接口对实现一无所知。通过指定属性,接口变得与实现强耦合,这违背了使用它的目的。
这就是为什么我想出了另一个解决方案,它适用于我,而不需要用属性强烈引用它。
型号
字符串
接口
型
TypeResolver
型
Dependent注入(例如在hostbuilder内部)
型
RestService
型
yuvru6vn3#
根据@Chris柏林给出的答案,我尝试了同样的方法,但在我的情况下,这个问题是在控制器级别-这意味着当我从 Postman 那里调用我的API时,我面临着这个问题(操作方法参数模型类有接口属性)。
我修改了我的startup.cs以使用Newtonsoft.json而不是System.json,方法是在我的start.cs中进行以下更改(沿着@Chris柏林的解决方案):
字符串
和它的工作.
koaltpgm4#
在这里:
字符串
您的列表属于
IImportOrderLineModel
接口类型。应该像
型
ImportOrderLineModel
是一个实现它的类,如下所示:型