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);// 递归查找 namestring name = obj.SelectToken("..name")?.ToString();// 递归查找 emailstring 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 了!