Как выбрать значение из файла JSON, который находит другое значение, используйте JQ - PullRequest
0 голосов
/ 29 сентября 2019

Я боролся с JSON.Я хочу найти информацию о состоянии работающего государства.Как я могу сделать это с jq или другим подобным bash -стилем?

Вот мой вывод curl:

{
  "relations": {
    "total": 9,
    "link": [
      {
        "href": "https://vro:8281/vco/api/workflows/6433f56f-13b7-46a7-a9ec-a3e38c7ff69d/",
        "rel": "up"
      },
      {
        "href": "https://vro:8281/vco/api/workflows/6433f56f-13b7-46a7-a9ec-a3e38c7ff69d/executions/",
        "rel": "add"
      },
      {
        "attributes": [
          {
            "value": "8f961082-cccc-412f-9244-16ba5b949dbe",
            "name": "id"
          },
          {
            "value": "2019-09-28T17:20:40.691-01:00",
            "name": "startDate"
          },
          {
            "value": "2019-09-28T17:20:43.949-01:00",
            "name": "endDate"
          },
          {
            "value": "completed",
            "name": "state"
          },
          {
            "value": "test",
            "name": "name"
          },
          {
            "name": "currentItemDisplayName"
          }
        ],
        "href": "https://vro:8281/vco/api/workflows/6433f56f-13b7-46a7-a9ec-a3e38c7ff69d/executions/8f961082-cccc-412f-9244-16ba5b949dbe/",
        "rel": "down"
      },
      {
        "attributes": [
          {
            "value": "b28832cb-2a97-4ec8-848f-35fec95eb867",
            "name": "id"
          },
          {
            "value": "2019-09-28T17:21:04.643-01:00",
            "name": "startDate"
          },
          {
            "value": "running",
            "name": "state"
          },
          {
            "value": "test",
            "name": "name"
          },
          {
            "name": "currentItemDisplayName"
          }
        ],
        "href": "https://vro:8281/vco/api/workflows/6433f56f-13b7-46a7-a9ec-a3e38c7ff69d/executions/b28832cb-2a97-4ec8-848f-35fec95eb867/",
        "rel": "down"
      }
}

Если я поговорю с примером, я хочу найти ключ hrefhttps://vro:8281/vco/api/workflows/6433f56f-13b7-46a7-a9ec-a3e38c7ff69d/executions/b28832cb-2a97-4ec8-848f-35fec95eb867/ с помощью ключа.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

альтернативно, тот же JSON-запрос может быть выполнен с использованием walk-path утилиты unix jtc (при условии, что вывод curl находится в curl.json):

bash $ jtc -w'[value]:<running>[-1]<state>[-3][href]' curl.json
"https://vro:8281/vco/api/workflows/6433f56f-13b7-46a7-a9ec-a3e38c7ff69d/executions/b28832cb-2a97-4ec8-848f-35fec95eb867/"
bash $ 

, если "value":"running" однозначно идентифицирует запись состояния, тогда запрос можно упростить до:

jtc -w'[value]:<running>[-3][href]' curl.json

PS.Я являюсь разработчиком jtc инструмента для обработки JSON.

0 голосов
/ 29 сентября 2019

После исправления примера JSON следующий запрос jq:

   .relations.link[]
   | select( has("attributes") )
   | select( any(.attributes[]; .value=="running" and .name == "state") )
   | .href

создает:

"https://vro:8281/vco/api/workflows/6433f56f-13b7-46a7-a9ec-a3e38c7ff69d/executions/b28832cb-2a97-4ec8-848f-35fec95eb867/"

в две строки (т. Е. С одной трубой)

.relations.link[]
| select(any(.attributes[]?; .value=="running" and .name == "state")).href
...