如何匹配 JsonPath 中的值

How to match values in JsonPath

如何匹配 JSONPath 中的特定值?

样本(来自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"
    }
  ]
}

我如何找到:

我试过了:

$.phoneNumbers[?(@.type=~/iPhone/i)].number
$..number[?(@=~/.*88/i)]

对于以 88 结尾的数字,您应该这样做:

选项 1(适用于 Jayway,不适用于 Goessner):

phoneNumbers[?(@.number =~ /^.*88$/i)].number

选项 2(适用于 Goessner,不适用于 Jayway):

phoneNumbers[?(/.*[88]$/.test(@.number))].number

要找到 iPhone 号码,您应该这样做:

phoneNumbers[?(@.type=='iPhone')].number

你可以试试这个:


        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/)]");

在所有四种情况下,您将得到包含以下值的 List<Map<String,Object>>

[{"type":"iPhone","number":"0123-4567-8888"}]

注:

'ending with 88' 的正则表达式无法按预期在 jsonpath.com 上运行,但在 Java 上运行。可能是我会在 jsonpath github.

上打开问题