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 了!

相关推荐
Kimi-学长1 小时前
PHP 爆出两个高危安全漏洞!CVE-2026-109618、CVE-2026-109619 修复方案与防护指南
开发语言·php
“AI国潮设计-小江”1 小时前
《【AIGC实战】Python+SDXL批量生成“英歌舞草莓抱抱卷蛋糕”IP插牌立牌方案,锁定角色一致性,甜品插件化落地》
开发语言·人工智能·python·prompt·aigc
雪落漂泊1 小时前
C++算法 滑动窗口篇(上)
开发语言·c++·算法
估值探索者1 小时前
【Python量化技术指标实战 04】布林带通道突破,怎么知道是真突破还是假突破?
java·开发语言·python·接口·股票数据api接口
Soneswy1 小时前
C++基础篇——类与对象(上)
开发语言·c++
kiracrimson1 小时前
STL简单引入:把数据结构做成模板
开发语言·数据结构·c++
1-1=01 小时前
.NET Core 输出日志
c#·.net·.netcore
fanruitian2 小时前
python property
开发语言·python
曹牧2 小时前
C#里引用ActiveX控件
开发语言·c#
汤姆宝库2 小时前
推理工程深拆:调度、量化与投机解码
android·开发语言·kotlin