Добавить JSON из глубоко вложенного значения на верхний уровень с помощью jq

Вот некоторые примеры данных: https://gist.github.com/dmc2015/19fc41aa677ba02a3bc49c53057ce408

Каждый скрипт, который у меня есть ниже, должен работать, но я не знаю, как их комбинировать. Мне нужно сделать следующее:

  • изменить имя ключа
  • иметь возможность выбирать определенные ключи для возврата, мне они все не нужны
  • уметь выбирать и анализировать значения
  • превратить проанализированные значения в пары ключ-значение и добавить их обратно в json

Изменить имя ключа

jq '.cards[] | select(.closed == false) | with_entries(if .key == "id" then .key = "trello_id" else . end) | .' data.json

возвращает:

{
  "trello_id": "1234",
  ...
  ..
}

Выберите определенные ключи для возврата

jq '.cards[] | with_entries(select([.key] | inside(["name", "description"]) ) ) | .' data.json

возвращает:

{
  "desc": "*Important Notes* ",
  "name": "Housing - Lawrence"
}

Запрашивать и анализировать значения для создания собственных ключей

jq '.cards[] |
.checklists[] | select(.name == "Acct Information") |
  .checkItems[] | select(.name | contains ("Location")) |
  .name | .'  data.json |
    cut -d ":" -f 1 |  sed 's/"//g' |  sed -e 's/\(.*\)/\L\1/' | sed -r 's/\s+/_/g'

возвращает: location_address

jq '.cards[] | .checklists[] | select(.name == "Acct Information") |
.checkItems[] | select(.name | contains ("Location")) |
  .name | .'  data.json |
  cut -d ":" -f 2 |
    sed -e 's/\"//g' -e 's/*//g'

возвращается "123 Hopscotch Way"

Я могу сделать большинство частей по отдельности, но я изо всех сил пытаюсь найти способ сделать все это в одном запросе. Это что-то близкое к конечному результату, который я хочу.


    [
      {
        "trello_id": "1234",
        "desc": "*Important Notes* ",
        "name": "Housing - Lawrence"
        "location_address": "123 Hopscotch Way"
      }
    ]

Опубликуйте исходный JSON и точный ожидаемый результат в формате JSON.

Inian 01.11.2022 06:24

Одна из причин, по которой вы должны делать то, что просил @Inian (хотя, если исходный JSON большой, пожалуйста, обрежьте его в соответствии с рекомендациями минимального воспроизводимого примера), заключается в том, что очевидно, что очень простое решение должно быть возможно. используя jq, но это сложно объяснить без примера.

peak 01.11.2022 07:12

А ваша команда jq работает или нет? Пожалуйста, предоставьте минимальный воспроизводимый пример. NB |. является избыточным и может быть исключен из любой программы jq.

knittl 01.11.2022 11:05

отредактировано с образцом данных @Inian

user3738936 01.11.2022 21:51

@peak я добавил данные

user3738936 01.11.2022 21:51
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
5
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Может ли что-то подобное быть тем, что вы ищете?

.cards | map(
  select(.closed == false) | {trello_id: .id, desc, name} + ([
    .checklists[] | select(.name == "Acct Information")
    | .checkItems[].name | select(contains("Location"))
    | capture("(?<key>[^:]*):\\s*(?<value>.*)")
    | .key |= (gsub("\\s+"; "_") | ascii_downcase)
    | .value |= gsub("\\*"; "")
  ] | from_entries)
)
[
  {
    "trello_id": "1234",
    "desc": "*Important Notes* ",
    "name": "Housing - Lawrence",
    "location_address": "123 Hopscotch Way"
  }
]

Демо

Другие вопросы по теме