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

使用Newtonsoft库实现JSON键大小写不敏感访问的问题

问题原因

你提到的Newtonsoft默认大小写不敏感,是反序列化为C#实体类时的行为。直接操作JObject的索引器时,默认是严格区分键的大小写的,这就是无法通过小写microsoft获取值的原因。

解决办法

方法1:修改JObject的键比较器(推荐,适合多次访问)

反序列化得到JObject后,修改其内部的键比较器为不区分大小写的规则,后续用索引器访问即可自动忽略大小写:

using (file)
{
    var serializer = new JsonSerializer();
    JObject json = null;
    using (var streamReader = new StreamReader(file))
    using (var reader = new JsonTextReader(streamReader))
    {
        try
        {
            json = serializer.Deserialize(reader) as JObject;
            // 设置不区分大小写的键比较器
            json.Comparer = StringComparer.OrdinalIgnoreCase;
        }
        catch (Exception e)
        {
            // 按需处理异常
        }
    }

    // 现在可通过小写键正常获取值
    var microsoftLogLevel = json["Logging"]["LogLevel"]["microsoft"];
}

方法2:使用SelectToken指定大小写忽略

如果仅需单次访问,直接用SelectToken方法并指定字符串比较规则:

// 点分隔路径写法
var microsoftLogLevel = json.SelectToken("Logging.LogLevel.microsoft", StringComparison.OrdinalIgnoreCase);

// 方括号路径写法
var microsoftLogLevel = json.SelectToken("['Logging']['LogLevel']['microsoft']", StringComparison.OrdinalIgnoreCase);

方法3:自定义扩展方法(适合复用场景)

封装一个扩展方法,统一处理大小写不敏感的键查找:

public static class JObjectExtensions
{
    public static JToken GetValueIgnoreCase(this JObject obj, string key)
    {
        return obj.Properties()
                   .FirstOrDefault(p => string.Equals(p.Name, key, StringComparison.OrdinalIgnoreCase))
                   ?.Value;
    }
}

使用示例:

var logLevelObj = json.GetValueIgnoreCase("logging") as JObject;
var microsoftLogLevel = logLevelObj?.GetValueIgnoreCase("loglevel")?.GetValueIgnoreCase("microsoft");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:20:22