我在下面列出了我的示例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"
]
},
{
"type":"biggroup",
"identifier":"newvillage",
"subjects":[
"Maths"
]
}
]
}
}
假设您使用Json.NET的SelectTokens()
方法进行JSONPath查询,您可能会使用以下查询找到所有数学科目:
var value = "Maths";
var subjects = root.SelectTokens($"class.subs[*].subjects[?(@ == '{value}')]");
当然,这只会返回一个值为"Maths"
的JValue
令牌序列。如果想要subjects[*]
数组中包含"Maths"
的class.subs[*]
对象,可以执行以下操作:
var subs = root.SelectTokens($"class.subs[?(@.subjects[?(@ == '{value}')])]");
注:
[?(...)]
将筛选表达式...
应用于数组。在过滤器表达式中,可以使用当前对象的
@
符号来匹配作为基元值的数组内容。Json.NET的JSONPath实现支持数组筛选器表达式中的嵌套查询。因此,
[?(@.subjects[?(@ == '{value}')])]
匹配在其"subjects"
数组中具有与值参数匹配的项的数组项。请注意,必须对包含单引号字符
'
的搜索值进行转义,如查询具有JSON路径和转义属性的JSON中所示。因此,如果要匹配的字符串是Math's
,则需要像这样转义:var value = "Math's".Replace("'", "\'");
在这里演示小提琴。