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

相关推荐
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
神仙别闹2 天前
基于C#+MySQL实现(WinForm)个人聊天室软件
c#
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁3 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
kybs19913 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
孙启超3 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust
此生决int3 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++
CoderYanger3 天前
A.每日一题:835. 图像重叠
java·开发语言·程序人生·leetcode·面试·职场和发展·学习方法
伞伞悦读3 天前
【第37期】Python JSON 与配置详解:序列化、反序列化、嵌套结构和配置文件
开发语言·python·json