.NET 5中如何配置使用Newtonsoft反序列化appsettings配置文件
.NET配置系统读取动态JSON字段的解决方案
问题根因
.NET 自带的配置系统的工作逻辑和常规JSON反序列化完全独立:它会把所有配置源(包括多个appsettings文件、环境变量、命令行参数等)的内容统一拍平为 key:value 格式的键值对集合,再通过反射绑定到目标类的属性,全程不会使用 Newtonsoft.Json 或者 System.Text.Json 的序列化特性,所以你加的 JsonExtensionData 特性自然不会生效。
解决方案1:直接读取配置文件用Newtonsoft反序列化
如果你一定要用Newtonsoft处理动态字段,直接读取原始配置文件内容自行反序列化即可,完全跳过默认配置绑定流程:
- 定义适配的实体类
// 动态JSON基类 public class ComplexJsonObject { // 固定必填字段 public string Operator { get; set; } // Newtonsoft扩展字段自动映射 [Newtonsoft.Json.JsonExtensionData] private IDictionary<string, JToken> _additionalData; // 可选:公开方法获取扩展字段 public JToken GetExtraField(string fieldName) { return _additionalData.TryGetValue(fieldName, out var value) ? value : null; } } // 配置根结构 public class AppConfigRoot { public ExtractionNode Extraction { get; set; } } public class ExtractionNode { public ComplexJsonObject When { get; set; } }
- 读取文件反序列化
// 在ASP.NET Core中获取当前环境的配置文件路径 var env = builder.Environment; var configPath = Path.Combine(env.ContentRootPath, $"appsettings.{env.EnvironmentName}.json"); // 读取原始JSON并反序列化 var rawJson = File.ReadAllText(configPath); var config = Newtonsoft.Json.JsonConvert.DeserializeObject<AppConfigRoot>(rawJson); // 直接使用动态字段 var rules = config.Extraction.When.GetExtraField("rules");
解决方案2:兼容默认配置系统的处理方式
如果你不想放弃默认配置系统的多源合并能力,可以将动态部分先绑定为字典,再自行转换:
public class ComplexJsonObject { public string Operator { get; set; } // 配置系统会自动将未匹配的字段绑定到这个字典 public Dictionary<string, object> ExtraFields { get; set; } }
绑定配置时直接用默认的Bind方法即可:
var whenConfig = builder.Configuration.GetSection("extraction:when").Get<ComplexJsonObject>();
内容的提问来源于stack exchange,提问作者Frederick Grumieaux
相关产品推荐
相关产品推荐

