Парсер jq json объединяет значение объекта вложенного массива

Привет, у меня есть файл JSON ниже с вложенным объектом:

{
  "Maps": {
    "Campus": [
      {
        "name": "nus",
        "Building": [
          {
            "name": "sde1",
            "Floor": [
              {
                "name": "floor1"
              },
              {
                "name": "floor2"
              }
            ]
          },
          {
            "name": "sde2"
          }
        ]
      },
      {
        "name": "ntu",
        "Building": [
          {
            "name": "ece1",
            "Floor": [
              {
                "name": "floor1"
              },
              {
                "name": "floor2"
              }
            ]
          },
          {
            "name": "ece2"
          }
        ]
      }
    ]
  }
}

Я хочу использовать jq для анализа вышеуказанного файла JSON и получения следующего формата:

nus>sde1>floor1
nus>sde1>floor2
ntu>ece1>floor1
ntu>ece1>floor2

в основном я должен объединить Campus Name с Building Name и Floor name и поместить символ < между ними.

Если поле вложенного объекта Floor не существует, игнорируйте синтаксический анализ и продолжайте следующий дочерний объект.

Как этого добиться? Спасибо.


person Xianlin    schedule 03.08.2016    source источник


Ответы (2)


Вы можете использовать следующую команду jq:

jq '.Maps.Campus[]|"\(.name)>\(.Building[]|"\(.name)>\(.Floor[]?.name)")"' file.json

jq достаточно умен, чтобы печатать комбинации .name и .Building[].name, поскольку .Building — это массив. То же действие применяется к .Building[].name и Floor[]?.name. ? потому что не всегда устанавливается пол.

person hek2mgl    schedule 03.08.2016
comment
Извините, мой первоначальный пост неверен, так как я не могу опубликовать длинный код json в stackoverflow, он всегда предлагает мне в основном код, пожалуйста, добавьте больше предупреждений о комментариях. Теперь я обновил свой файл JSON и требования. Спасибо. - person Xianlin; 03.08.2016
comment
поэтому для вложенного массива json используйте несколько конвейеров | и (), чтобы вложить эти значения вместе и построить фильтр. Спасибо. - person Xianlin; 04.08.2016

Вот решение, которое использует переменные jq

  .Maps.Campus[]
| .name as $campus
| .Building[]
| .name as $bldg
| .Floor[]?
| .name as $floor
| "\($campus)>\($bldg)>\($floor)"
person jq170727    schedule 28.08.2017