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

.NET 5中如何配置使用Newtonsoft反序列化appsettings配置文件

.NET配置系统读取动态JSON字段的解决方案

问题根因

.NET 自带的配置系统的工作逻辑和常规JSON反序列化完全独立:它会把所有配置源(包括多个appsettings文件、环境变量、命令行参数等)的内容统一拍平为 key:value 格式的键值对集合,再通过反射绑定到目标类的属性,全程不会使用 Newtonsoft.Json 或者 System.Text.Json 的序列化特性,所以你加的 JsonExtensionData 特性自然不会生效。

解决方案1:直接读取配置文件用Newtonsoft反序列化

如果你一定要用Newtonsoft处理动态字段,直接读取原始配置文件内容自行反序列化即可,完全跳过默认配置绑定流程:

  1. 定义适配的实体类
// 动态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; }
}
  1. 读取文件反序列化
// 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:15:06