C# JObject 快速定位节点值

C# JObject 快速定位节点值

快速获取 JObject 中的某个节点值,可以使用 SelectToken 方法,支持 JSONPath 表达式,非常方便。例如:

csharp 复制代码
using Newtonsoft.Json.Linq;
using System;

class Program
{
    static void Main()
    {
        string json = @"{
            'name': '张三',
            'info': {
                'age': 25,
                'address': {
                    'city': '深圳',
                    'zip': '518000'
                }
            }
        }";

        JObject obj = JObject.Parse(json);

        // 直接获取值
        string name = obj["name"]?.ToString(); 
        string city = obj["info"]?["address"]?["city"]?.ToString();

        // 使用 SelectToken (支持 JSONPath)
        string zip = obj.SelectToken("info.address.zip")?.ToString();

        Console.WriteLine($"姓名: {name}, 城市: {city}, 邮编: {zip}");
    }
}

关键点

  • obj["key"] 适合直接访问一级或多级属性。

  • obj.SelectToken("path") 支持 JSONPath,如 info.address.zip

  • 使用 ?.ToString() 避免 null 访问异常。

这种方法简单高效,适用于复杂 JSON 解析。

JObject 模糊匹配和多层级自动匹配

SelectToken 支持模糊匹配多层级自动匹配 ,可以使用 JSONPath 语法,比如 ..(递归查找)和 [*](匹配所有数组元素)。
示例 1:模糊匹配(递归查找)

如果你不确定某个字段在哪一层,可以使用 .. 递归匹配:

csharp 复制代码
using Newtonsoft.Json.Linq;
using System;

class Program
{
    static void Main()
    {
        string json = @"{
            'user': {
                'details': {
                    'name': '张三',
                    'contact': {
                        'email': 'zhangsan@example.com'
                    }
                }
            }
        }";

        JObject obj = JObject.Parse(json);

        // 递归查找 name
        string name = obj.SelectToken("..name")?.ToString();
        
        // 递归查找 email
        string email = obj.SelectToken("..email")?.ToString();

        Console.WriteLine($"姓名: {name}, 邮箱: {email}");
    }
}

🔹 ..name 直接找到 name,无论它在哪个层级。

🔹 ..email 递归查找 email 字段。


示例 2:数组中的模糊匹配

如果 JSON 里有数组,想获取所有元素的某个字段,可以用 [*]

csharp 复制代码
string json = @"{
    'users': [
        { 'id': 1, 'name': '张三' },
        { 'id': 2, 'name': '李四' }
    ]
}";

JObject obj = JObject.Parse(json);

// 获取所有用户的名字
var names = obj.SelectTokens("$.users[*].name");

foreach (var name in names)
{
    Console.WriteLine($"用户: {name}");
}

🔹 $.users[*].name 匹配 users 数组中的所有 name 字段。


示例 3:未知层级中的字段

如果字段的位置不确定,又可能在数组里,可以结合 ..[*]

csharp 复制代码
string json = @"{
    'data': {
        'users': [
            { 'info': { 'id': 1, 'name': '张三' } },
            { 'info': { 'id': 2, 'name': '李四' } }
        ]
    }
}";

JObject obj = JObject.Parse(json);

// 递归查找所有 name
var names = obj.SelectTokens("$..name");

foreach (var name in names)
{
    Console.WriteLine($"用户: {name}");
}

🔹 $..name 递归查找 所有层级name


总结

.. 递归查找,不管字段在哪一层。

[*] 遍历数组中的所有元素。

SelectTokens("$.path") 可以返回 多个匹配结果 ,而 SelectToken("$.path") 只返回 第一个匹配的结果

这样就能 快速、灵活地匹配 JSON 结构 ,不需要手动遍历 JSON 了!

相关推荐
hez20103 天前
在 .NET 上构建超大托管数组
c#·.net·.net core·gc·clr
雨落倾城夏未凉8 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
唐青枫9 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
唐青枫10 天前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
咕白m62511 天前
.NET 环境下 Word 超链接批量提取方案
c#·.net
用户917215619021111 天前
C# 通信协议增量解析:用状态机处理半包和粘包
c#
小码编匠11 天前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
唐青枫13 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech14 天前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf
Scout-leaf15 天前
C#摸鱼实录——IoC与DI案例详解
c#