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

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

9 голосов
/ 05 января 2010

Привет всем, мне было интересно, знает ли кто-нибудь способ использования регулярного выражения или оператора подстановочного знака (или pehaps '%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*’]

Спроси меня, не хочешь ли ты уточнить вопрос?

Ответы [ 3 ]

14 голосов
/ 05 января 2010

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

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

метод RegExp test () (который JSONPath eval s за кадром).

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

4 голосов
/ 07 июня 2018

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

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

=~

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

1 голос
/ 14 сентября 2017

Если кому-то нужно решение для размещения в 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;
...