目前,我们正在使用这样的路线:
[HttpPost]
[Route("upload")]
public async Task<dynamic> Upload(dynamic uploadedData)
{
JArray files = uploadedData.pdfs;
// ...
}
我不想使用dynamic
,而是希望对传入的数据有一个示意性的理解。所以我可以使用这样的设置,使用一个定义模式的类:
public class UploadRequest : JObject
{
public JArray pdfs { get; set; }
}
[HttpPost]
[Route("upload")]
public async Task<dynamic> Upload(UploadRequest uploadedData)
{
// Now can access the JArray via uploadedData.pdfs directly
// ...
}
这是处理这种情况的正确方法吗?或者是否有另一种通过 ASP .NET WebAPI 接收 JSON 数据的标准最佳实践?
具体来说,这种方法目前行不通。虽然我的小模式类扩展了 JObject,但我得到了一个错误
The parameters dictionary contains an invalid entry for parameter 'uploadedData' for method 'System.Threading.Tasks.Task`1[System.Object] Upload(UploadRequest)' in 'EditPdfServer.Controllers.PdfFileController'. The dictionary contains a value of type 'Newtonsoft.Json.Linq.JObject', but the parameter requires a value of type 'EditPdfServer.Controllers.PdfFileController+UploadRequest'.
那么首先,这看起来是一种正确的方法吗?其次,还有更好的吗?第三,为什么这种方法不起作用?提前致谢。
最佳答案
你在正轨上。
您无需过分关注 Newtonsoft.Json 的内部实现。特别是,您应该尽量避免使用 JObject/JToken/其他 J 类型,并且您绝对不需要子类化 JObject。
您的请求对象类可以是:
public class UploadRequest
{
[JSONProperty("pdfs")]
public SomePDFClass PDFs[] { get; set; }
}
这将映射到以下请求:
{
"pdfs": [
{ <some PDF object here> },
{ <some PDF object here> },
{ <some PDF object here> }
]
}
JSONPropertyAttribute
的字符串参数定义属性在 JSON 文档中出现的名称,因此您不需要在代码中使用与在 JSON 中相同的名称。您可以在代码中更改名称,只要属性仍然使用与文档相同的名称即可。
关于c# - ASP .NET WebAPI 路由数据模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33526523/