Получить идентификатор родительского элемента при разборе данных json с помощью jq - PullRequest
0 голосов
/ 05 июля 2018

Я хочу напечатать идентификатор родительского элемента, когда значение дочернего элемента client_release из данных JSON.

если data.properties.value == "client_release"

тогда вывод должен быть

abcd1g2f,hirk5d7b3l

Я попробовал ниже, но не повезло

jq '.data[].properties[]|select(.value=="client_release")|.id'

Данные JSON приведены ниже:

{  
   "data":[  
      {  
         "id":"abcd1g2f",
         "resourceURI":"https://somerepo.com/service/local/privileges/abcd1g2f",
         "name":"release1",
         "description":"release1",
         "type":"target",
         "userManaged":true,
         "properties":[  
            {  
               "key":"repositoryGroupId",
               "value":""
            },
            {  
               "key":"method",
               "value":"create,read"
            },
            {  
               "key":"repositoryId",
               "value":"client_release"
            },
            {  
               "key":"repositoryTargetId",
               "value":"1"
            }
         ]
      },
      {  
         "id":"asdf1k4g",
         "resourceURI":"https://somerepo.com/service/local/privileges/asdf1k4g",
         "name":"release2",
         "description":"release2",
         "type":"target",
         "userManaged":true,
         "properties":[  
            {  
               "key":"repositoryGroupId",
               "value":""
            },
            {  
               "key":"method",
               "value":"read"
            },
            {  
               "key":"repositoryId",
               "value":"formal_release"
            },
            {  
               "key":"repositoryTargetId",
               "value":"1"
            }
         ]
      },
      {  
         "id":"hirk5d7b3l",
         "resourceURI":"https://somerepo.com/service/local/privileges/hirk5d7b3l",
         "name":"release3",
         "description":"release3",
         "type":"target",
         "userManaged":true,
         "properties":[  
            {  
               "key":"repositoryGroupId",
               "value":""
            },
            {  
               "key":"method",
               "value":"create,read"
            },
            {  
               "key":"repositoryId",
               "value":"client_release"
            },
            {  
               "key":"repositoryTargetId",
               "value":"1"
            }
         ]
      }
   ]
}

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Следующий фильтр позволяет избежать дублирования и может быть более эффективным, чем использование select (.properties []. Value ...):

.data
| map(select(.properties | any(.[]; .value == "client_release")) | .id)
| join(",")

(В качестве альтернативы можно использовать @csv в конце, если вы хотите, чтобы значения .id были в виде строк JSON.)

"repositoryId"

Если внимание следует уделять только значению, соответствующему «repositoryId», то вы можете используйте from_entries, например ::

.data
| map(select(.properties | from_entries.repositoryId == "client_release") | .id)
| join(",")
0 голосов
/ 05 июля 2018

Идея верна, но массив data[] должен быть вне оператора select,

jq '.data[] | select(.properties[].value == "client_release") | .id'

Чтобы поместить его в формате CSV, как указано в вопросе, поместите результат в массив и используйте конструкцию @csv

jq --raw-output '[.data[] | select(.properties[].value == "client_release") | .id] | @csv'
...