2015-09-08 3 views
1

После нескольких часов чтения и тестирования всех выражений JSON Path, которые пришли мне на ум, как логических выражений, так и нечувствительных выражений, я до сих пор не знаю, как я могу извлечь все cmis:objectId где cmis:objectTypeId равны F:cm:custom от ВСЕХ object объектов независимо от того, вложенной глубина:JSONPath - получить все значения, где объект othervalue равно строке

{ 

    {... [... nested objects and arrays as needed for a tree strucutre 
    object : { 
     "succinctProperties": { 

      "cmis:objectTypeId": "F:cm:custom", 

      "cmis:objectId": "39cdd896-4563-4302-bba9-398006572522", 
      ... 
     } 
    }, 
    }... }... close nested objects and arrays as needed for a tree strucutre 
    "id": "e244881e-e96b-406b-8d1f-faecae35d7f2" 

} 

некоторых вещи, которые я пробовал и сэкономленные от моих ста попыток:

$.[*]..succinctProperties[?(@['cmis:objectTypeId']=='F:wim:caseEntries')].cmis:objectId 


$.[*]..succinctProperties.cmis:objectId // Returns ALL without condition 


$.[*].*..succinctProperties[?(@.['cmis:objectTypeId']=='F:wim:caseEntries')] 

$.[*]..succinctProperties[@.cmis:objectTypeId=='F:wim:caseEntries')].cmis:objectId 

Примечания: Я используя http://www.jsonquerytool.com/, потому что я использую «JSON Path Extractor» JMeter плагин и этот плагин использует http://goessner.net/articles/JsonPath/

+0

Никто не может мне помочь? Пожалуйста, :( – Pali

ответ

4

Я не уверен, из вашего вопроса, нужно ли вам cmis:objectTypeId также всегда быть непосредственно под succinctProperties объекта, или это нужно только, чтобы быть где-то под объектом object. Если последнее, я верю, что у меня есть решение вашего вопроса. Для первого я считаю, что вы, возможно, достигли предела того, на что способен JSON Path.

Я использовал этот пример JSON, чтобы проверить запрос:

{ 
    "anotherobject": { 
     "object" : { 
      "someothernesting": { 
       "succinctProperties": { 
        "cmis:objectTypeId": "F:cm:custom", 
        "cmis:objectId": "39cdd896-4563-4302-bba9-398006572522" 
       } 
      } 
     } 
    }, 
    "object" : { 
     "succinctProperties": { 
      "cmis:objectTypeId": "F:cm:custom", 
      "cmis:objectId": "11111111-4563-4302-bba9-222222222222" 
     } 
    }, 
    "noobject": { 
     "succinctProperties": { 
      "cmis:objectTypeId": "F:cm:custom", 
      "cmis:objectId": "3333333-4563-4302-bba9-4444444444" 
     } 
    } 
} 

Это запрос. С $..object.. это выглядит для всех объектов в любом месте под object объектов, а затем фильтрует их только те, с cmis:objectTypeId собственности:

$..object..[?(@['cmis:objectTypeId']=="F:cm:custom")].cmis:objectId 

И эти результаты (я использовал http://www.jsonquerytool.com, чтобы проверить его):

[ 
    "11111111-4563-4302-bba9-222222222222", 
    "39cdd896-4563-4302-bba9-398006572522" 
] 

Причина, по которой что-то вроде $..succinctProperties[?(@['cmis:objectTypeId']=="F:cm:custom")] ничего не возвращает, потому что JSON Path обычно ожидает, что объект, который фильтруется (в данном случае succinctProperties), будет массивом объектов. @ относится к объекту в массиве. Поскольку succinctProperties не является массивом, он рассматривает отдельные свойства объекта как части массива и поэтому ищет свойство cmis:objectTypeId для каждого свойства succinctProperties, а не для самого succinctProperties. Поэтому, если у вас была такая структура:

{ 
    "succinctProperties": { 
     "property": { 
      "cmis:objectTypeId": "F:cm:custom", 
      "cmis:objectId": "3333333-4563-4302-bba9-4444444444" 
     } 
    } 
} 
+0

Да 'cmis: objectId' и' cmis: objectTypeId' всегда находятся под объектом 'succinctProperties', но родительская структура меняется, иногда это' $. [*]. Object.succinctProperties', иногда это '$ .data. [*]. object.succinctProperties', а иногда '$. [*]. object.object.succinctProperties', но в любом случае я теперь понимаю, как JSONPath hanldes фильтрует differnet на объектах и ​​массивах. Большое вам спасибо, у меня нет прочитайте такую ​​информацию в любом месте, так что спасибо снова! – Pali