目前,我们正在使用这样的路线:
[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,但我得到了错误
参数字典包含参数'uploadedData'的无效条目,用于方法'System.Threading.Tasks.Task`1 [System.Object] Upload(UploadRequest)'in'EditPdfServer.Controllers.PdfFileController'。该字典包含“Newtonsoft.Json.Linq.JObject”类型的值,但该参数需要“EditPdfServer.Controllers.PdfFileController + UploadRequest”类型的值。
首先,这看起来像是一种正确的方法吗?其次,有更好的吗?第三,为什么这种方法不起作用?提前谢谢。
答案 0 :(得分:6)
你正在走上正轨。
您不必过分关注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中相同的名称。您可以在代码中更改名称,只要该属性仍然使用与文档相同的名称。
答案 1 :(得分:5)
我建议您使用JSON属性属性为pdfs属性:
public class UploadRequest : JObject
{
[JSONProperty("<name of the property in the JSON object>")]
public JArray pdfs { get; set; }
}
另请查看此帖子,了解有关该属性的更多信息:JSON.NET deserialize/serialize JsonProperty JsonObject
答案 2 :(得分:0)
由于您的方法使用的是动词,您应该在方法参数上添加属性<div class="pan">
<img src="http://lorempixel.com/1920/480/" />
</div>
:
[FromBody]