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

