Невозможно захватить значение элемента, используя jq - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь извлечь содержимое dumpName с помощью jq, но это не работает. Я попытался упростить структуру исходного файла, так как не могу опубликовать полную информацию здесь.

Я также хотел бы получить содержимое param2. При необходимости это может быть собрано в отдельном выражении jq.

{
  "get": {
    "download": {
      "ebR": true,
      "detail": [
        {
          "downloadHost": "xxx.jgs.com",
          "downloadURL": "xxx.jgs.com",
          "dumpInfo": {
            "dumpCategory": "Other",
            "dumpContentType": "UNKNOWN",
            "dumpId": test,
            "dumpName": "name_of_dump",
            "dumpSize": 1200,
            "dumpStatus": "COMPLETED",
            "dumpUploadDate": "date",
            "vis": "who_see_it"
          },
          "datastore": [
            {
              "param1": "random_val",
              "param2": "random_val"
            },
            {
              "param1": "testtest",
              "param2": "testtest"
            }
          ],
          "Info": {
            "webpage": "test@test.com"
          }
        }
  }
}
}

Желаемый вывод:

name_of_dump
random_val
testtest

Предыдущие попытки:

jq '.[] | .[]'   # gives section from { ebR
jq '.[] | .[] | .[]'   # gives error:

верно jq: error (at: 399): невозможно перебрать строку ("http://www.. .)

jq '.[] | .[] | .[] | .dumpName'  # gives error:

jq: ошибка (at: 399): Невозможно индексировать логическое значение со строкой «dumpName»

Спасибо.

Ответы [ 4 ]

2 голосов
/ 11 июля 2019

Вам нужно записать JSON с правильными именами объектов / массивов. Использование простой записи .[] не позволит вам достичь этого

jq --raw-output '.get.download.detail[] | .dumpInfo.dumpName, .datastore[0].param1, .datastore[1].param1'

Также входной JSON не является синтаксически допустимым. Посмотрите этот jqplay URL , который показывает, что фильтр работает во время выполнения.

1 голос
/ 11 июля 2019

Вы можете рассмотреть этот однострочный:

jq '.. | (.dumpName? // empty), (.param2? // empty)' input.json
0 голосов
/ 28 июля 2019

также, альтернативный простой способ отображения содержимого JSON - это утилита unix, основанная на пошаговом пути jtc

bash $ <download.json jtc -qq -w'<dumpName>l' -w'<param2>l:'
name_of_dump
random_val
testtest
bash $ 

PS> Раскрытие информации: я являюсь создателем инструмента jtc - shell cli для операций JSON

0 голосов
/ 11 июля 2019

Поскольку пользователь попросил отобразить dumpName и param2 , вот правильный код:

jq -r '.get.download.detail[] | .dumpInfo.dumpName, .datastore[].param2'

Выход:

name_of_dump
random_val
testtest

Как пользователь (Inian), упомянутый выше, ваш JSON-файл недействителен.

Вот правильный JSON:

{
  "get": {
    "download": {
      "ebR": true,
      "detail": [
        {
          "downloadHost": "xxx.jgs.com",
          "downloadURL": "xxx.jgs.com",
          "dumpInfo": {
            "dumpCategory": "Other",
            "dumpContentType": "UNKNOWN",
            "dumpId": "test",
            "dumpName": "name_of_dump",
            "dumpSize": 1200,
            "dumpStatus": "COMPLETED",
            "dumpUploadDate": "date",
            "vis": "who_see_it"
          },
          "datastore": [
            {
              "param1": "random_val",
              "param2": "random_val"
            },
            {
              "param1": "testtest",
              "param2": "testtest"
            }
          ],
          "Info": {
            "webpage": "test@test.com"
          }
        }
      ]
    }
  }
}
...