如何在JSONPath中按字符串过滤?

Ala*_*air 48 json jsonpath

我有来自Facebook API的JSON响应,如下所示:

{
  "data": [
     {
       "name": "Barack Obama", 
       "category": "Politician", 
       "id": "6815841748"
     }, 
     {
       "name": "Barack Obama's Dead Fly", 
       "category": "Public figure", 
       "id": "92943557739"
     }]
 }
Run Code Online (Sandbox Code Playgroud)

我想将JSONPath应用于它,只返回类别为"Politician"的结果.从我读过的内容看来,我需要这样做:

$.data[?(@.category=='Politician')]
Run Code Online (Sandbox Code Playgroud)

但根据我发现的测试工具,这不起作用.我发现了另一个问题,表明我应该使用"eq"而不是"==",但这也不起作用.我在这里弄错了什么?

pb2*_*b2q 28

您的查询看起来很好,您的数据和查询使用此JsonPath解析器为我工作.另请参阅该页面上的示例查询以获取更多谓词示例.

您正在使用的测试工具似乎有问题.即使JsonPath站点中的示例返回不正确的结果:

例如,给定:

{
    "store":
    {
        "book":
        [ 
            { "category": "reference",
              "author": "Nigel Rees",
              "title": "Sayings of the Century",
              "price": 8.95
            },
            { "category": "fiction",
              "author": "Evelyn Waugh",
              "title": "Sword of Honour",
              "price": 12.99
            },
            { "category": "fiction",
              "author": "Herman Melville",
              "title": "Moby Dick",
              "isbn": "0-553-21311-3",
              "price": 8.99
            },
            { "category": "fiction",
              "author": "J. R. R. Tolkien",
              "title": "The Lord of the Rings",
              "isbn": "0-395-19395-8",
              "price": 22.99
            }
        ],
        "bicycle":
        {
            "color": "red",
            "price": 19.95
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

表达式:$.store.book[?(@.length-1)].title,该工具返回所有标题的列表.

  • 谢谢。非常令人沮丧,但这可能是我的懒惰和不寻找其他工具的错。 (2认同)
  • `$.store.book[*].title` 将提供相同的结果。 (2认同)

小智 7

我没有找到从 json 中的名称-值对中提取值的正确 jsonpath 过滤器语法。

下面是语法和简短的示例 twitter 文档。

本站对测试很有用:

jsonpath 过滤器表达式:

.events[0].attributes[?(@.name=='screen_name')].value
Run Code Online (Sandbox Code Playgroud)

测试文档:

{
  "title" : "test twitter",
  "priority" : 5,
  "events" : [ {
    "eventId" : "150d3939-1bc4-4bcb-8f88-6153053a2c3e",
    "eventDate" : "2015-03-27T09:07:48-0500",
    "publisher" : "twitter",
    "type" : "tweet",
    "attributes" : [ {
      "name" : "filter_level",
      "value" : "low"
    }, {
      "name" : "screen_name",
      "value" : "_ziadin"
    }, {
      "name" : "followers_count",
      "value" : "406"
    } ]
  } ]
}
Run Code Online (Sandbox Code Playgroud)


小智 6

删除引号:

List<Object> bugs = JsonPath.read(githubIssues, "$..labels[?(@.name==bug)]");
Run Code Online (Sandbox Code Playgroud)

另请参见此Json Path示例页面