Dan Beam
Dan Beam

Reputation: 3927

JSONPath :contains filter

Hey all, I was wondering if any knew of a way to use a regular expression or wildcard operator (or pehaps '%LIKE%' in SQL) so I could use JSONPath to do searching within a large set of JSON data.

For instance (and yes, I'm parsing, not eval( )ing my data in the app):

var obj = eval ( '({ "hey": "can you find me?" })' );

And I'd like to be able to look through the data like this:

$.[?(@.hey:contains(find))] // (in jQuery terminology)

where the contents of an argument is part or all of the value in the { "key" : "value" } pairs in my data.

At the moment I have only found documentation on >, <, =, and != relational operators, which don't give me that much flexibility.

Does anyone know a way I can just just JSONPath to find this data (without having to loop through all the entries)?

I don't want to use Dojo's JSONQuery, as this would require another library. However, it lets you do this, here their example:

[?description~‘*the*’]

Ask me if you want more clarification of the question.

Upvotes: 17

Views: 51035

Answers (5)

Aleksandr Chernyi
Aleksandr Chernyi

Reputation: 340

You can use LIKE in jsonpath this way:

$.[?(@.hey like_regex '.*find.*')]

Upvotes: -1

vlatko606
vlatko606

Reputation: 1149

=~ worked for me. Tested with Jmeter 5.3 JSON Extractor.

Upvotes: 2

Badtestor
Badtestor

Reputation: 105

Also, may be it will be useful for someone. Link to JSONPath Notation

It works for me (JMeter 4.0)

=~

Match a JavaScript regular expression. For example, [?(@.description =~ /cat.*/i)] matches items whose description starts with cat (case-insensitive).

Upvotes: 8

Akshay Shinde
Akshay Shinde

Reputation: 159

If anyone wants the contains solution in Java then this works with JsonPath

Filter<?> filter = Filter.filter(Criteria.where("hey").regex(Pattern.compile(".*find.*")));
System.out.println(JsonPath.read(json, "$..[?]", filter));

Imports

import com.jayway.jsonpath.Criteria;
import com.jayway.jsonpath.Filter;
import com.jayway.jsonpath.JsonPath;

Upvotes: 4

Dan Beam
Dan Beam

Reputation: 3927

nevermind, guys, found a way to do it by just using ECMA inside of JSONPath, though this is not a native selector / operator. Simply used:

$.[?(/find/.test(@.hey))]

the RegExp test( ) method (which JSONPath evals behind the scenes).

If anyone has a better answer, though, let me know.

Upvotes: 27

Related Questions