oob*_*bug 1 asp.net-core asp.net-core-webapi
我的 ASP.NET Core 端点接受 JSON 表单作为其输入并调用需要动态参数的方法。我试图调用这样的方法:
[HttpPost]
public IActionResult InitializeAction([FromBody] dynamic jsonData)
{
return this.Ok(this.MyMethod(jsonData));
}
Run Code Online (Sandbox Code Playgroud)
当我将 JSON 发布{"test": "value"}到此方法时,我希望执行以下操作具有相同的行为:
[HttpPost]
public IActionResult InitializeAction([FromBody] dynamic jsonData)
{
return this.Ok(this.MyMethod(new {test = "value"}));
}
Run Code Online (Sandbox Code Playgroud)
但是,使用[FromBody]参数检索到的 JSON 值不会转换为标准的 .NET 动态参数,而是沿着这些线的一个JsonDocument或JsonElement或某物。
如何从 HTTP Post 接收或序列化 JSON 作为 .NET 动态对象?
更新 31/07/2020
如果转换object为ExpandoObject,则可以test直接访问。
[HttpPost]
[Route("/init")]
public IActionResult Init([FromBody] dynamic jsonData)
{
var converter = new ExpandoObjectConverter();
var exObjExpandoObject = JsonConvert.DeserializeObject<ExpandoObject>(jsonData.ToString(), converter) as dynamic;
return this.Ok(this.MyMethod(exObjExpandoObject));
}
public string MyMethod(dynamic obj)
{
return obj.test;
}
Run Code Online (Sandbox Code Playgroud)
如果使用的话object,就需要熬过去value了GetProperty。
[HttpPost]
[Route("/init2")]
public IActionResult InitializeAction([FromBody] dynamic jsonData)
{
return this.Ok(this.MyMethod2(jsonData));
}
public string MyMethod2(dynamic obj)
{
JsonElement value = obj.GetProperty("test");
return value.ToString();
}
Run Code Online (Sandbox Code Playgroud)
这ExpandoObject是一种方便的类型,允许设置和检索动态成员。它实现了IDynamicMetaObjectProvider在DLR. 因为它实现了IDictionaryand IEnumerable,所以它可以使用CLR. 这允许 的实例ExpandoObject强制转换为IDictionary。
要将 ExpandoObject 与任意 JSON 一起使用,您可以编写以下程序:
[HttpPost]
[Route("/init")]
public IActionResult InitializeAction([FromBody] dynamic jsonData)
{
var converter = new ExpandoObjectConverter();
var exObj = JsonConvert.DeserializeObject<ExpandoObject>(jsonData.ToString(), converter);
Debug.WriteLine($"exObj.test = {exObj?.test}, type of {exObj?.test.GetType()}") as dynamic;
return this.Ok(exObj.test);
}
Run Code Online (Sandbox Code Playgroud)
测试截图:
参考
在 C# 中使用动态类型
传入的 JSON 正文可以通过使用JsonConvert.DeserializeObjectJSON 字符串转换为动态对象。
[HttpPost]
public IActionResult InitializeAction([FromBody] dynamic jsonData)
{
dynamic data = JsonConvert.DeserializeObject<dynamic>(jsonData.ToString())
return this.Ok(this.MyMethod(data));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4695 次 |
| 最近记录: |