.NET Core 5如何绑定动态对象?dynamic参数无法读取属性怎么解决
问题根因
ASP.NET Core 默认使用 System.Text.Json 做JSON序列化与模型绑定,dynamic 类型参数接收到的实际是 JsonElement 类型实例,这才会出现你看到的 ValueKind 属性,该类型不支持直接通过 .属性名 的方式读取JSON字段值。
另外你当前的参数写法存在一个常见问题:单个POST请求体的内容默认无法拆分绑定到多个Action参数,name 参数也会绑定失败。
方案1:保留默认System.Text.Json,手动取值/转动态对象
首先调整Action的参数写法,加[FromBody]特性,用单个参数接收完整请求体:
[HttpPost] public ActionResult Post([FromBody] JsonElement request) { // 读取Name字段 string name = request.GetProperty("Name").GetString(); // 读取Other下的item字段 string itemValue = request.GetProperty("Other").GetProperty("item").GetString(); // 如果需要用dynamic访问,可转成ExpandoObject dynamic dynamicRequest = System.Text.Json.JsonSerializer.Deserialize<ExpandoObject>(request); string dynamicItemValue = dynamicRequest.Other.item; }
该方案不需要引入额外依赖,适合不想调整序列化组件的场景。
方案2:替换为Newtonsoft.Json实现直接dynamic属性访问
如果你希望完全支持用 .属性名 直接读取动态字段,可将默认序列化器替换为Newtonsoft.Json(Json.NET):
- 安装对应的NuGet包
Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson
- 在服务注册逻辑中开启Newtonsoft.Json支持(.NET 6+ 写在Program.cs中)
builder.Services.AddControllers() .AddNewtonsoftJson();
- 调整Action代码:
[HttpPost] public ActionResult Post([FromBody] dynamic request) { string name = request.Name.ToString(); string itemValue = request.Other.item.ToString(); // 任意用户自定义字段都可以直接通过.访问 int count = request.ItemCount; }
该方案完全适配你需要动态接收任意用户自定义字段的模板业务场景,代码写法最简洁。
内容的提问来源于stack exchange,提问作者AliK
相关产品推荐
相关产品推荐

