Ruediger Jungbeck
Ruediger Jungbeck

Reputation: 2964

How to match values in JsonPath

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

Answers (2)

Thomas Verhoeven
Thomas Verhoeven

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

stuparm
stuparm

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

Note:

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

Related Questions