Reputation: 2964
How do I match specific values in JSONPath?
Sample (from jsonpath.com):
{
"firstName": "John",
"lastName" : "doe",
"age" : 26,
"address" : {
"streetAddress": "naist street",
"city" : "Nara",
"postalCode" : "630-0192"
},
"phoneNumbers": [
{
"type" : "iPhone",
"number": "0123-4567-8888"
},
{
"type" : "home",
"number": "0123-4567-8910"
}
]
}
How do I find:
I tried:
$.phoneNumbers[?(@.type=~/iPhone/i)].number
$..number[?(@=~/.*88/i)]
Upvotes: 2
Views: 2081
Reputation: 286
For the numbers ending with 88 you should do:
Option 1 (works in Jayway, not in Goessner):
phoneNumbers[?(@.number =~ /^.*88$/i)].number
Option 2 (works in Goessner, not in Jayway):
phoneNumbers[?(/.*[88]$/.test(@.number))].number
To find the iPhone number you should do:
phoneNumbers[?(@.type=='iPhone')].number
Upvotes: 3
Reputation: 553
You could try with this:
String json = "{\n" +
" \"firstName\": \"John\",\n" +
" \"lastName\" : \"doe\",\n" + ...
...
...
// sample 1.1
Filter filter_1_1 = Filter.filter(Criteria.where("type").eq("iPhone"));
List<Map<String, Object>> value_1_1 = JsonPath.parse(json).read("$['phoneNumbers'][?]", filter_1_1);
// sample 1.2
List<Map<String, Object>> value_1_2 = JsonPath.parse(json).read("$['phoneNumbers'][?(@['type'] == 'iPhone')]");
// sample 2.1
Filter filter_2_1 = Filter.filter(Criteria.where("number").regex(Pattern.compile(".*88")));
List<Map<String, Object>> value_2_1 = JsonPath.parse(json).read("$['phoneNumbers'][?]", filter_2_1);
// sample 2.2
List<Map<String, Object>> value_2_2 = JsonPath.parse(json).read("$['phoneNumbers'][?(@['number'] =~ /.*88/)]");
In all four cases you will get List<Map<String,Object>>
that contains values:
[{"type":"iPhone","number":"0123-4567-8888"}]
The regex for 'ending with 88' does not work on jsonpath.com as expected, but it works from Java. It might be that I will open the issue on jsonpath github.
Upvotes: 0