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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:41:01