2015-04-17 3 views
4

У меня есть массив в JSON, и я хотел бы применить два фильтра к нему так:?.JsonPath И оператор на массив

$ ._ embedded.values ​​[0] ._ embedded.data [(@ var1 = 'value1' & & @ .var2 = 'value2')]

Мне нужно выбрать только те элементы из массива, которые удовлетворяют операции И. Однако на практике это, похоже, не работает.

Возможно ли это сделать или выполнить два шага для извлечения одного набора, а затем снова фильтровать, чтобы получить окончательные результаты?

ответ

1

Насколько я знаю, AND/OR еще не поддерживается. Но вы можете относительно близко относиться к этому массиву [,]. Но даже это заставило меня задуматься, когда я его протестировал. Есть странное поведение. Я взял пример строки JSON из Jayway JsonPath Evaluator и поместил его в JsonPath Expression Tester (потому что он не работал с Jayway, когда я пытался).

Так JSON я тестировал с версией curiousconcept является:

{ 
    "store": { 
     "book": [ 
      { 
       "category": "reference", 
       "author": "Nigel Rees", 
       "title": "Sayings of the Century", 
       "price": 8.95 
      }, 
      { 
       "category": "fiction", 
       "author": "Evelyn Waugh", 
       "title": "Sword of Honour", 
       "price": 12.99 
      }, 
      { 
       "category": "fiction", 
       "author": "Herman Melville", 
       "title": "Moby Dick", 
       "isbn": "0-553-21311-3", 
       "price": 8.99 
      }, 
      { 
       "category": "fiction", 
       "author": "J. R. R. Tolkien", 
       "title": "The Lord of the Rings", 
       "isbn": "0-395-19395-8", 
       "price": 22.99 
      } 
     ], 
     "bicycle": { 
      "color": "red", 
      "price": 19.95 
     } 
    }, 
    "expensive": 10 
} 

И выражение:

$..book[?(@.price==8.99),?(@.category=='fiction')] 

что приводит:

[ 
    { 
     "category":"fiction", 
     "author":"Herman Melville", 
     "title":"Moby Dick", 
     "isbn":"0-553-21311-3", 
     "price":8.99 
    } 
] 

то, что кажется идеально. (Взять цену 8,99 и категория 'фантастику' ... отлично!)

НО: изменить его на:

$..book[?(@.category=='fiction'),?(@.price==8.99)] 

то выход:

[ 
] 

кажется, меня, что [,] не очень хорошо реализована в Jayway JsonPath Tester, а также curiousconcept.com.

Но из того, что я знаю, они работают над (реальной) реализацией AND и/или (issue27 here в коде Google).

Надеюсь, это прояснит хотя бы что-то!

+0

Спасибо, вы в значительной степени подтвердили мои подозрения и его хорошо знать, что я не делаю что-то совершенно глупо. Для моего случая использования кажется, что он просто не работает вообще, даже если я пытаюсь переключать атрибуты. –

+0

В качестве альтернативы я обнаружил, что могу добиться того, что мне нужно, используя фильтры Predicates в своем Java-коде –

+0

да ... если вы получили что-то (например, java, C# ...) для дальнейшей обработки результатов (результатов), это не так уж плохо что операторы не работают ... – stefankmitph

7

Реализация Jayway поддерживает встроенные критерии И и ИЛИ.

$..book[?(@.price==8.99 && @.category=='fiction')] 

[ 
    { 
     "category" : "fiction", 
     "author" : "Herman Melville", 
     "title" : "Moby Dick", 
     "isbn" : "0-553-21311-3", 
     "price" : 8.99 
    } 
] 

Попробуйте и сравнить различные варианты реализации здесь http://jsonpath.herokuapp.com/

+0

Удивительное спасибо.Реализация jspnpath в Интернете очень чистая и отлично работает. – Beezer