Как вставить пару ключ-значение после указанного ключа в объекте JSON, используя jq?

У меня есть файл JSON, как это

{
    "hierarchy": {
        "structure": {
            "card_11001": [
                "addCard_4111"
            ],
            "container_11006": [
                "mainContainer_11007",
                "subContainer_10016"
            ],
            "mainContainer_11007": [
                "paymentMethodList_10001"
            ],
            "orderWrap_10012": [
                "orderSummary_10005"
            ],
            "paymentMethodList_10001": [
                "card_11001",
                "placeOrder_10013"
            ],
            "root_10000": [
                "payNotice_11011",
                "payNotice_10020",
                "container_11006",
                "placeOrderResultAction_10004"
            ],
            "subContainer_10016": [
                "orderWrap_10012",
                "footer_10014"
            ]
        }
    }
}

И я хочу вставить

"offline_11018": [
    "instruction_908",
    "checkboxList_11019"
]

Между "mainContainer_11007" а также "orderWrap_10012" поэтому результат, который я хочу, должен выглядеть следующим образом:

{
    "hierarchy": {
        "structure": {
            "card_11001": [
                "addCard_4111"
            ],
            "container_11006": [
                "mainContainer_11007",
                "subContainer_10016"
            ],
            "mainContainer_11007": [
                "paymentMethodList_10001"
            ],
            "offline_11018": [
                "instruction_908",
                "checkboxList_11019"
            ],
            "orderWrap_10012": [
                "orderSummary_10005"
            ],
            "paymentMethodList_10001": [
                "card_11001",
                "placeOrder_10013"
            ],
            "root_10000": [
                "payNotice_11011",
                "payNotice_10020",
                "container_11006",
                "placeOrderResultAction_10004"
            ],
            "subContainer_10016": [
                "orderWrap_10012",
                "footer_10014"
            ]
        }
    }
}

Все, что я знаю, это то, что я могу только добавить его в конец файла с

jq --raw-output '.hierarchy.structure + {"offline_11018": ["instruction_908","checkboxList_11019"]}'

Но это не то, что я хочу, я хочу вставить его между двумя другими клавишами. Как я могу сделать это с помощью команды jq?

1 ответ

Самый простой подход будет использовать to_entries преобразовать .hierarchy.structure в массив, выполнить вставку, а затем использовать from_entries для восстановления объекта, в соответствии с:

.hierarchy.structure |= (to_entries
  | ... as $ix
  | .[:$ix] + ($x | to_entries) + .[$ix:]
  | from_entries)

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

indexof/1

Вот полезное определение "def" для наименьшего индекса, для которого выполняется некоторое условие:

# If the input is an array, emit the least index, $i, 
# for which `.[$i]|f` is truthy, otherwise emit null.
# Works similarly if the input is a JSON object.
def indexof(f):
  label $out
  | foreach .[] as $x (null; .+1;
      if ($x|f) then (.-1, break $out) else empty end) // null;

Решение с использованием indexof

Собираем вышеперечисленные кусочки вместе:

{"offline_11018": [ "instruction_908", "checkboxList_11019" ]} as $x
| .hierarchy.structure |= (to_entries
    | (1 + indexof( .value | index("mainContainer_11007") )) as $ix
    | .[:$ix] + ($x | to_entries) + .[$ix:]
    | from_entries)
Другие вопросы по тегам