2015-06-16 3 views
2

У меня есть структуру JSON, который является вложенным родитель/ребенок вида структуры:JSONPath выражения: получение значения определенного атрибута, основанное на его присутствие или значение другого атрибута

{ 
    "type": "site", 
    "profile_id": "site profile id", 
    "children": [ 
    { 
     "type": "dealer", 
     "profile_id": "dealer profile id", 
     "children": [ 
     { 
      "type": "location", 
      "profile_id": "location profile id", 
      "children": [ 
      { 
       "type": "customer", 
       "profile_id": "customer profile id", 
       "children": [ 
       { 
        "type": "farm", 
        "farm_id": "farm id", 
        "children": [ 
        { 
         "type": "field", 
         "field_id": "field id" 
        }]}]}]}]}]} 

Есть ли способ в JSONPath выполнить одно из следующих действий:

  1. дать мне profile_id, если он присутствует, или дайте мне farm_id если он присутствует, или дайте мне FIELD_ID, если он присутствует.

  2. дать мне profile_id если тип = клиент, или дайте мне farm_id, если тип = ферму, или дайте мне FIELD_ID если тип = поле

  3. дать мне п-й атрибут из каждого класса. Идентификатор фактически является третьим атрибутом в каждом классе. Это мой наименее любимый вариант, потому что я не знаю, будет ли id всегда третьим атрибутом.

+0

Если вы готовы сделать три звонка JSONPath, вариант 2 будет довольно простым. Получение профиля, если type = customer будет выглядеть следующим образом: '$ .. [? (@. Type == 'customer')]. Profile_id'. См. [Link] (http://stackoverflow.com/questions/30680515/find-object-in-nested-data-by-property-value-with-jsonpath/30683008#30683008) для другого примера. Кроме того, поскольку вы можете столкнуться с проблемами с этим, вам не хватает синтаксиса в вашем JSON, например. запятые между полями и двойные кавычки вокруг имен свойств. – Duncan

+0

Дункан, это отлично работало для моей ситуации. Также спасибо за вызов синтаксиса. Я отредактирую вопрос, чтобы улучшить его. –

+0

Рад, что я мог помочь. Я отправлю это в качестве официального ответа, чтобы этот вопрос можно было закрыть. – Duncan

ответ

2

Решение для варианта 2, которое требует 3 отдельных запроса, будет следующим. Вот 3 запросы:

$..[?(@.type=='customer')].profile_id 
$..[?(@.type=='farm')].farm_id 
$..[?(@.type=='field')].field_id 

Я проверил эти запросы с http://www.jsonquerytool.com

this question Также см для подобного примера.

Смежные вопросы