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

相关推荐
charliedev4 分钟前
Jedi:Python 自动补全与静态分析的实用工具
开发语言·python·其他
ji1985944318 分钟前
MATLAB 求散点曲线斜率
开发语言·算法·matlab
kaikaile199522 分钟前
MATLAB 实现:Koch & Zhao 图像水印算法(DCT域)
开发语言·算法·matlab
love_muming25 分钟前
链表每日一练
java·开发语言·数据结构·链表·idea·每日一练
weixin_4462608526 分钟前
LLM智能体在社交模拟中的决策行为分析:有限状态与LLM-based策略对比研究
开发语言·php
牛肉在哪里32 分钟前
ros2 从零开始28 监听广播C++
开发语言·c++·算法·机器人
techdashen44 分钟前
Cargo 1.94 开发周期全解析
开发语言·后端·rust
charlie1145141911 小时前
现代C++特性指南——constexpr 构造函数与字面类型
开发语言·c++
北城以北88881 小时前
虚拟机安装JDK,Tomcat,部署项目
java·开发语言·tomcat
江华森1 小时前
Python 3 实战教程:从零基础到项目实战
开发语言·python