如何使用 JSONPath 通过包含在 JSON 内部数组中的字符串值过滤 JSON

问题描述

我在下面列出了我的示例 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