Как вставить пару ключ-значение после указанного ключа в объекте 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)