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));
}
当我将 JSON 发布{"test": "value"}到此方法时,我希望执行以下操作具有相同的行为:
[HttpPost]
public IActionResult InitializeAction([FromBody] dynamic jsonData)
{
    return this.Ok(this.MyMethod(new {test = "value"}));
}
但是,使用[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;
    }
如果使用的话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();
    }
这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);
    }
测试截图:
参考
在 C# 中使用动态类型
传入的 JSON 正文可以通过使用JsonConvert.DeserializeObjectJSON 字符串转换为动态对象。
[HttpPost]
public IActionResult InitializeAction([FromBody] dynamic jsonData)
{
    dynamic data = JsonConvert.DeserializeObject<dynamic>(jsonData.ToString())
    return this.Ok(this.MyMethod(data));
}
| 归档时间: | 
 | 
| 查看次数: | 4695 次 | 
| 最近记录: |