首页 > 解决方案 > 如何在 Web Api 的主体中传递派生的 JObject 类

问题描述

如果我有课

public class TestMe : JObject
{

}

如何在 API 方法中使用它?

public async Task<IHttpActionResult> UpdateMe(int accountId, [FromBody] TestMe sometest)
{
  Console.WriteLine(sometest);
  ...

当我尝试为身体发布任何内容时,例如:

{
  "Bye": "string"
}

Console.WriteLine在方法中的行UpdateMe甚至被命中之前,我收到以下错误:

"The parameters dictionary contains an invalid entry for parameter 'sometest' for method 'System.Threading.Tasks.Task`1[System.Web.Http.IHttpActionResult] UpdateMe(Int32, TestMe)' in '<somepath>.Controllers.MiscController'. The dictionary contains a value of type 'Newtonsoft.Json.Linq.JObject', but the parameter requires a value of type 'TestMe'."

标签: c#.netasp.net-mvcwebapi

解决方案


控制器不能接受直接从该类继承的JObject类。(更多信息在这里)。我假设在您的情况下,您不知道您将在输入 JSON 中收到哪些属性。这些是可能的解决方案:

仅接受JObject控制器中的类。

[Route("{accountID}")]
[HttpPost]
public async Task<IHttpActionResult> UpdateMe(int accountId, [FromBody] JObject sometest)
{
    string test = sometest.ToString();

    return Ok(test);
}

你可以JObject随心所欲地与班级一起工作。示例 -在此处阅读更多内容
这是解决问题的一种方法。


另一种解决方案是将 JSON 正文作为原始 JSON 读取,并根据您的需要进行操作:

[Route("{accountID}")]
[HttpPost]
public async Task<IHttpActionResult> UpdateMe(int accountId)
{
    string rawContent = string.Empty;
    using (var contentStream = await this.Request.Content.ReadAsStreamAsync())
    {
        contentStream.Seek(0, SeekOrigin.Begin);
        using (var sr = new StreamReader(contentStream))
        {
            rawContent = sr.ReadToEnd();
            // use raw content here
        }
    }

    return Ok(rawContent);
}

未知输入 JSON 的另一种解决方案是接受dynamic控制器中的类型,但我个人不建议这样做。如何实现它阅读这里。为什么我不喜欢它,请在此处查看。



推荐阅读