如何在 JSONPath 中通过字符串进行过滤?

我有一个来自 Facebook API 的 JSON 响应,看起来像这样:

{
"data": [
{
"name": "Barack Obama",
"category": "Politician",
"id": "6815841748"
},
{
"name": "Barack Obama's Dead Fly",
"category": "Public figure",
"id": "92943557739"
}]
}

我希望将 JSONPath 应用于它,以便只返回“ Politican”类别的结果。据我所知,我需要做的是:

$.data[?(@.category=='Politician')]

但根据我找到的 测试工具数据,这个不管用。我发现 另一个问题建议我应该使用“ eq”而不是“ = =”,但这也不起作用。我哪里搞错了?

139032 次浏览

您的查询看起来很好,您的数据和查询使用 这个 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
}
}
}

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

”Alastair,您可以使用这个 lib 和工具: DefiantJS。它支持对 JSON 结构的 XPath 查询,您可以测试和验证这个 XPath:

//data[category="Politician"]

DefiantJS 使用方法“ search”扩展全局对象,该方法返回一个包含匹配项的数组。在 Javascript 中,它看起来像这样:

var person = JSON.search(json_data, "//people[category='Politician']");
console.log( person[0].name );
// Barack Obama

删掉引号:

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

再看看这个 Json Path 示例页面

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

下面是语法和缩写的 twitter 文档示例。

这个网站 对测试很有用:

Jsonpath 过滤器表达式:

.events[0].attributes[?(@.name=='screen_name')].value

测试文件:

{
"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"
} ]
} ]
}

浏览器测试工具虽然方便,但可能有点欺骗性:

{
"resourceType": "Encounter",
"id": "EMR56788",
"text": {
"status": "generated",
"div": "Patient admitted with chest pains</div>"
},
"status": "in-progress",
"class": "inpatient",
"patient": {
"reference": "Patient/P12345",
"display": "Roy Batty"
}
}

大多数工具返回的结果都是错误的:

$[?(@.class==inpatient)]

但是当我执行死刑的时候

<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>1.2.0</version>
</dependency>

我建议编写一个简单的单元测试来验证,而不是依赖于浏览器测试工具。