JSONPath: содержит фильтр

Привет всем, мне было интересно, знает ли кто-нибудь способ использования регулярного выражения или оператора с подстановочными знаками (или, возможно, '%LIKE%' в SQL), чтобы я мог использовать JSONPath для поиска в большом наборе данных JSON.

Например (и да, я разбираю свои данные в приложении, а не eval( )):

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

И я хотел бы иметь возможность просматривать данные вот так:

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

где содержимое аргумента является частью или всем значением в парах { "key" : "value" } в моих данных.

На данный момент я нашел документацию только по операторам отношения >, <, = и !=, которые не дают мне такой гибкости.

Кто-нибудь знает, как я могу просто просто JSONPath найти эти данные (без необходимости перебирать все записи)?

Я не хочу использовать JSONQuery Dojo, так как для этого потребуется другая библиотека. Однако он позволяет вам это сделать, вот их пример:

[?description~‘*the*’]

Спросите меня, хотите ли вы дополнительных разъяснений по этому вопросу.


person Dan Beam    schedule 05.01.2010    source источник
comment
о да, вот документация - goessner.net/articles/JsonPath   -  person Dan Beam    schedule 05.01.2010


Ответы (4)


Nevermind, ребята, нашел способ сделать это, просто используя ECMA внутри JSONPath, хотя это не собственный селектор / оператор. Просто использовал:

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

метод RegExp test () (который JSONPath evals за кулисами).

Если у кого-то есть лучший ответ, дайте мне знать.

person Dan Beam    schedule 05.01.2010

Также может быть кому-то будет полезно. Ссылка на нотацию JSONPath

У меня работает (JMeter 4.0)

=~

Соответствует регулярному выражению JavaScript. Например, [? (@. Description = ~ /cat.*/i)] соответствует элементам, описание которых начинается с cat (без учета регистра).

person Badtestor    schedule 07.06.2018

Если кому-то нужно решение, содержащееся в Java, это работает с JsonPath

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

Импорт

import com.jayway.jsonpath.Criteria;
import com.jayway.jsonpath.Filter;
import com.jayway.jsonpath.JsonPath;
person Akshay Shinde    schedule 14.09.2017

= ~ у меня сработало. Протестировано с помощью Jmeter 5.3 JSON Extractor.

person vlatko606    schedule 16.09.2020