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
相关产品推荐
相关产品推荐

