问题描述
我在下面列出了我的示例 JSON, 我想编写一个 JSONPath,当主题具有(或包含)“数学”时选择元素。
注意:我正在使用 Goessner 的 JSONPath 使用 Newtonsoft 库 (C#)**
{
"class":{
"type":"group","identifier":"MyFavClass","subs":[
{
"type":"individual","identifier":"Rambo"
},{
"type":"individual","identifier":"Rancho"
},{
"type":"biggroup","identifier":"village","subjects":[
"Maths","English"
]
},"identifier":"newvillage","subjects":[
"Maths"
]
}
]
}
}
解决方法
假设您使用 Json.NET 的 SelectTokens()
方法进行 JSONPath 查询,您可以使用以下查询找到所有数学科目:
var value = "Maths";
var subjects = root.SelectTokens($"class.subs[*].subjects[?(@ == '{value}')]");
当然,这只会返回值 JValue
的 "Maths"
令牌序列。如果您想要 class.subs[*]
数组包含 subjects[*]
的 "Maths"
对象,您可以这样做:
var subs = root.SelectTokens($"class.subs[?(@.subjects[?(@ == '{value}')])]");
注意事项:
-
[?(...)]
将过滤器表达式...
应用于数组。 -
在过滤器表达式中,可以使用当前对象的
@
符号匹配属于原始值的数组内容。 -
Json.NET 的 JSONPath 实现支持数组过滤器表达式中的嵌套查询。因此,
[?(@.subjects[?(@ == '{value}')])]
匹配在其"subjects"
数组中具有与 value 参数匹配的项目的数组项目。 -
请注意,必须对包含单引号字符
'
的搜索值进行转义,如 Querying JSON with JSON Path and escaped properties 所示。因此,如果要匹配的字符串是Math's
,您需要像这样转义它:var value = "Math's".Replace("'","\\\'");
演示小提琴here。