C#中如何将字符串a[0].b转换为可访问的JSON键?(Newtonsoft.Json.Linq)
处理类似
a[0].b的复合路径访问JObject的方法 你遇到的问题很典型——JObject的索引器[]只能识别单个键名,没法直接解析带数组索引和点分隔的复合路径字符串,所以直接用js[keys]会报错。不过好在Newtonsoft.Json.Linq已经给我们提供了现成的解决方案,不用自己造轮子!
方法一:用内置的SelectToken方法(推荐)
SelectToken专门支持JSONPath格式的路径字符串,像a[0].b这种写法完全兼容,直接调用就能拿到对应的值:
using Newtonsoft.Json.Linq; // 你的输入路径和JSON字符串 string targetPath = "a[0].b"; string jsonContent = @"{'a': [{'b' : 'hello'}, {'b': 'world'}]}"; // 解析JSON为JObject(用JObject比dynamic更类型安全,当然用dynamic也可以) JObject jsonObj = JObject.Parse(jsonContent); // 用SelectToken获取对应值 JToken value = jsonObj.SelectToken(targetPath); Console.WriteLine(value); // 输出 hello // 测试访问第二个元素的b字段 targetPath = "a[1].b"; value = jsonObj.SelectToken(targetPath); Console.WriteLine(value); // 输出 world
如果习惯用dynamic,也可以这么写:
dynamic dynamicJson = JObject.Parse(jsonContent); JToken dynamicValue = dynamicJson.SelectToken(targetPath); Console.WriteLine(dynamicValue);
方法二:自定义路径解析逻辑(适合学习或自定义需求)
如果想要自己实现路径拆分的逻辑,可以写一个扩展方法,把复合路径拆分成单个访问步骤,逐个节点遍历:
using Newtonsoft.Json.Linq; public static class JTokenHelper { public static JToken GetValueFromPath(this JToken token, string path) { if (token == null || string.IsNullOrWhiteSpace(path)) return null; var currentNode = token; // 按点拆分路径段 var pathSegments = path.Split('.'); foreach (var segment in pathSegments) { // 处理带数组索引的段,比如"a[0]" if (segment.Contains('[') && segment.Contains(']')) { // 拆分键名和索引部分 var keyEndIndex = segment.IndexOf('['); var key = segment.Substring(0, keyEndIndex); var indexStr = segment.Substring(keyEndIndex + 1, segment.IndexOf(']') - keyEndIndex - 1); // 先获取键对应的节点 currentNode = currentNode[key]; if (currentNode == null) return null; // 转换为数组并按索引访问 if (currentNode is JArray arrayNode && int.TryParse(indexStr, out int index)) { if (index >= 0 && index < arrayNode.Count) currentNode = arrayNode[index]; else return null; } else { // 不是数组或者索引无效,返回null return null; } } else { // 普通键名访问 currentNode = currentNode[segment]; if (currentNode == null) return null; } } return currentNode; } }
使用这个扩展方法的示例:
string targetPath = "a[0].b"; JObject jsonObj = JObject.Parse(jsonContent); JToken customValue = jsonObj.GetValueFromPath(targetPath); Console.WriteLine(customValue); // 输出 hello
总结一下,优先用官方的SelectToken方法,简单高效;如果有特殊需求再考虑自定义解析逻辑。
内容的提问来源于stack exchange,提问作者cieunteung
相关产品推荐
相关产品推荐

