You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在.NET 6 ApiController的JSON负载中如何声明绑定动态结构的字段?

解决方案

针对.NET 6 + Newtonsoft.Json 环境下绑定动态JSON结构的需求,最简洁稳定的实现方式是使用Newtonsoft.Json原生的JToken类型声明动态字段:

步骤1:修改负载类定义

JToken是Newtonsoft中所有JSON节点的公共基类,支持存储任意JSON结构(对象、数组、字符串、数字、布尔值、null),不会出现嵌套包装的问题:

using Newtonsoft.Json.Linq;

public class SomePayload {
   public int id {get;set;}
   public JToken dynamicData {get;set;}
}

步骤2:使用动态字段

你可以根据实际场景直接操作JToken,无需额外手动解析:

  • 直接读取属性值:
    // 示例:读取dynamicData下的x属性
    int x = payload.dynamicData.Value<int>("x");
    // 也支持动态语法访问
    int x2 = (int)payload.dynamicData.x;
    
  • 转成自定义强类型对象:
    public class CustomData { public int x {get;set;} }
    var data = payload.dynamicData.ToObject<CustomData>();
    
  • 遍历动态数组、子节点等操作都支持原生API,无需额外处理。
  • 如果需要把动态部分重新序列化为JSON字符串,直接调用ToString()即可:
    string jsonStr = payload.dynamicData.ToString();
    

可选方案:保留dynamic类型的修复方式

如果你坚持要使用dynamic类型,实际上你遇到的{{"x":1}}嵌套是调试器的视图包装问题,运行时访问属性payload.dynamicData.x是可以正常拿到值的。如果要消除调试显示问题,可以在配置Newtonsoft时关闭动态类型的包装:

builder.Services.AddControllers()
.AddNewtonsoftJson(options =>
{
    options.SerializerSettings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.None;
});

不过该方案存在运行时绑定异常的风险,更推荐使用JToken方案。


内容的提问来源于stack exchange,提问作者MiguelSlv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:54:03