C-JObject-快速定位节点值
目录
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 了!