Добавить новую запись в Json после или до указанной существующей записи с помощью jq - PullRequest
1 голос
/ 22 января 2020

У меня есть следующий ввод, и я хочу ниже вывода, используя jq.

Я хотел бы добавить

  • запись "zeiterfassungAktiviert" : true сразу после клавиши gueltigBis ( или, альтернативно, перед клавишей inhaltsverzeichnis)
  • добавить запись в конец объекта inhaltsverzeichnis, добавив запись "zeiterfassung": "zeiterfassung"

Пример ввода:

{
  "fachbereich": "qp",
  "produktTyp": "PRODUKT_ANFRAGE_V1",
  "name": "Produkt Anfrage",
  "kurzName": "anfrage",
  "gueltigAb": "2019-01-01T00:00:00.000",
  "gueltigBis": "2022-12-31T00:00:00.000",
  "inhaltsverzeichnis": {
    "versandumfang": "auftragsverwaltung/versandumfang",
    "dokumentenerzeugung": "dokumentenerzeugung"
  }
}

Пример вывода:

{
  "fachbereich": "qp",
  "produktTyp": "PRODUKT_ANFRAGE_V1",
  "name": "Produkt Anfrage",
  "kurzName": "anfrage",
  "gueltigAb": "2019-01-01T00:00:00.000",
  "gueltigBis": "2022-12-31T00:00:00.000",
  "zeiterfassungAktiviert": true,
  "inhaltsverzeichnis": {
    "versandumfang": "auftragsverwaltung/versandumfang",
    "dokumentenerzeugung": "dokumentenerzeugung",
    "zeiterfassung": "zeiterfassung"
  },
}

Мне удалось выполнить вторую часть, но не ясно, как go узнать о первой части.

Команда: jq '.zeiterfassungAktiviert += "zeiterfassung" | .inhaltsverzeichnis.zeiterfassung += "zeiterfassung"'

Результат выглядит следующим образом:

{
  "fachbereich": "qp",
  "produktTyp": "PRODUKT_ANFRAGE_V1",
  "name": "Produkt Anfrage",
  "kurzName": "anfrage",
  "gueltigAb": "2019-01-01T00:00:00.000",
  "gueltigBis": "2022-12-31T00:00:00.000",
  "inhaltsverzeichnis": {
    "versandumfang": "auftragsverwaltung/versandumfang",
    "dokumentenerzeugung": "dokumentenerzeugung",
    "zeiterfassung": "zeiterfassung"
  },
  "zeiterfassungAktiviert": true
}

Как видите, он добавляется в конец объекта root. Я хотел бы как-то указать позицию, в идеале, без необходимости конвертировать в массив и конвертировать обратно, если это возможно, а сказать: добавьте запись после / перед указанным ключом.

1 Ответ

2 голосов
/ 22 января 2020

Для первой части полезно иметь вспомогательную функцию:

def insertkv($afterkey; $key; $value):
  def insertafter($ix; $x): .[0:1+$ix] + [$x] + .[1+$ix:];

  to_entries
  | insertafter( map(.key) | index($afterkey);  {$key, $value})
  | from_entries;

Версии

Вышеуказанное предназначено для использования с jq 1.5 или выше. Для более ранних версий требуются незначительные изменения.

...