当前位置: 首页 > news >正文

C# JObject 快速定位节点值

C# JObject 快速定位节点值

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

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:模糊匹配(递归查找)
如果你不确定某个字段在哪一层,可以使用 .. 递归匹配:

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 里有数组,想获取所有元素的某个字段,可以用 [*]

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:未知层级中的字段
如果字段的位置不确定,又可能在数组里,可以结合 ..[*]

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

相关文章:

  • 洞悉C++内存结构:解锁深层优化潜力
  • go个人论坛项目
  • 邮箱验证:外贸邮件营销中的关键策略
  • Future<V>接口 和 CompletableFuture<T>类 介绍
  • Ubuntu conda虚拟环境不同设备之间迁移
  • 环境配置 | [特殊字符] 5分钟极简Git入门:从零上手版本控制
  • Goby 漏洞安全通告| Apache Tomcat 远程命令执行(CVE-2025-24813)
  • LabVIEW cRIO中CSV文件的读取
  • iOS底层原理系列01-iOS系统架构概览-从硬件到应用层
  • 文献分享: Aligner——学习稀疏对齐的检索模型
  • 《解锁 Lodash:简化复杂逻辑的实战技巧》​
  • 【Web】HTML5 Canvas 2D绘图的封装
  • 并发操作的同步_第四章_《C++并发编程实战》笔记
  • 速算迷你世界脚本UI
  • Redis基础
  • 字符串算法深入
  • 【python】OpenCV—Hough Circle Transform
  • 动态调试环境配置(Android Studio + IDA Pro)
  • 【Spring】Spring是如何解决循环依赖问题的
  • [C语言]内存函数的使用和模拟实现
  • 家国万里·时光故事会|构筑中国船舰钢筋铁骨,她在焊花里展现工匠风范
  • 上海交大曾小勤:科技传播不应停留于知识搬运,要做科学思维的播种机
  • 泽连斯基:俄代表团级别低,没人能做决定
  • 李伟任山东省委常委、省纪委书记
  • 国寿资产获批参与第三批保险资金长期投资改革试点
  • 侵害孩子者,必严惩不贷!3名性侵害未成年人罪犯今日执行死刑