2017-02-13 22 views

ответ

2

Для этого конкретного случая, вы можете сделать это:

$ jq '.a |= (.b = {}) + .b' input.json 

Здесь мы обновляем объект a с исходным содержимым с b, замененным пустым объектом и сочетающим его с h содержание оригинала b.

Если бы это было слишком трудно рассуждать о том, что это может быть легче следовать:

$ jq '.a |= 
    with_entries(if .key == "b" 
     then (.value = {}), (.value | to_entries[]) 
     else . 
    end)' input.json 
+0

+1 Спасибо, что подтолкнул меня в правильном направлении. Более общим решением было бы использовать прогулку, которую я опубликовал как отдельный ответ. –

1

Это просто вариант @ первого решения Джеффа-Меркадо, но может быть немного легче следовать (в частности, из-за есть только одна ссылка на .b, и потому, что группировка по РИТ явно):

.a |= ({b:{}} + .b) 
0

чтобы сделать это рекурсивно для любого использования поля:

walk 
(
    if (type == "object" and has("b")) then 
     .|=.b 
    else 
     . 
    end 
)