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': '[email protected]'
}
}
}
}";
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 了!