如何匹配 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"
}
]
}
我如何找到:
- iPhone号
- 所有以 88 结尾的号码
我试过了:
$.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.
上打开问题
如何匹配 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"
}
]
}
我如何找到:
- iPhone号
- 所有以 88 结尾的号码
我试过了:
$.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.
上打开问题