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

C#中如何将含动态字段的JSON映射到Runtime生成的Forecast子类?

解决方案

针对你已经通过反射生成的继承自Forecast的动态类型对象,可借助.NET常用JSON序列化库完成JSON到动态对象的反序列化,核心是利用动态类型的Type信息指定反序列化目标类型。

方法一:使用 Newtonsoft.Json(Json.NET)

Newtonsoft.Json对动态类型、反射场景支持灵活,直接通过动态类型的Type对象即可完成反序列化:

// 获取动态生成的类型
Type dynamicForecastType = newObjectForecast.GetType();
// 后端返回的JSON字符串示例
string jsonFromBackend = "{\"Id\":1, \"Description\":2, \"fc\":25, \"fci\":30}";

// 反序列化到动态类型对象
dynamic deserializedObj = JsonConvert.DeserializeObject(jsonFromBackend, dynamicForecastType);

若JSON字段名与动态类型属性名存在命名差异(如JSON用下划线、C#用驼峰),可配置命名策略适配:

var settings = new JsonSerializerSettings
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};
dynamic deserializedObj = JsonConvert.DeserializeObject(jsonFromBackend, dynamicForecastType, settings);

如果已有动态类型实例,也可以直接填充数据:

JsonConvert.PopulateObject(jsonFromBackend, newObjectForecast);

方法二:使用 System.Text.Json

针对.NET Core/.NET 5+ 自带的System.Text.Json,同样通过动态类型的Type完成反序列化:

// 获取动态类型
Type dynamicForecastType = newObjectForecast.GetType();
string jsonFromBackend = "{\"Id\":1, \"Description\":2, \"fc\":25, \"fci\":30}";

// 反序列化
dynamic deserializedObj = JsonSerializer.Deserialize(jsonFromBackend, dynamicForecastType);

如需处理命名差异或忽略JSON中未定义的字段,可配置序列化选项:

var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // 适配驼峰命名
    IgnoreUnknownFields = true // 忽略未在动态类型中定义的字段
};
dynamic deserializedObj = JsonSerializer.Deserialize(jsonFromBackend, dynamicForecastType, options);

关键注意事项

  • 动态生成的类型属性名称需与JSON字段名完全匹配(或通过命名策略映射),否则对应字段无法正确赋值。
  • 动态生成的属性必须具备公共的get和set访问器,序列化库需通过访问器完成属性赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 01:32:02