如何使用jq在JSON对象的指定键后插入键值对?
如何使用jq在JSON对象的指定键后插入键值对?
先看你提供的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" ] } } }
想要在指定键(比如card_11001)后面插入新的键值对?别担心,jq可以轻松实现,还能保留原有键的顺序,下面是具体方案:
核心思路:把对象转成键值对数组操作
jq默认处理对象时会按键名排序,但如果想精准在某个键后面插入,我们可以先把对象拆成{key: "...", value: "..."}格式的数组,完成插入后再转回对象。
示例:在card_11001后插入新键值对
比如要插入"newCard_11002": ["addNewCard_4112"],直接用这条命令即可:
jq ' .hierarchy.structure |= ( to_entries | splice(index(.[] | select(.key == "card_11001")) + 1; 0; [{key: "newCard_11002", value: ["addNewCard_4112"]}]) | from_entries ) ' input.json
我给你拆解下每一步的作用:
.hierarchy.structure |= (...):锁定要修改的目标对象,将后面处理的结果重新赋值给它。to_entries:把structure里的键值对转换为数组格式,方便我们操作元素位置。index(.[] | select(.key == "card_11001")):找到card_11001这个键在数组中的索引位置。splice(索引+1; 0; [新元素]):在目标键的下一个位置插入新的键值对(splice的参数依次是:起始位置、要删除的元素数量、要插入的元素数组)。from_entries:把修改后的数组重新转换回对象结构。
更省心的写法:封装成函数
如果需要多次执行这类插入操作,不如把逻辑封装成jq函数,调用起来更简洁:
jq ' def insert_after(target_key, new_key, new_value): to_entries | splice(index(.[] | select(.key == target_key)) + 1; 0; [{key: new_key, value: new_value}]) | from_entries; # 调用函数,指定目标键、新键和对应的值 .hierarchy.structure |= insert_after("card_11001", "newCard_11002", ["addNewCard_4112"]) ' input.json
额外提醒
- 如果指定的目标键不存在,这个命令会自动把新键值对插到对象的末尾,不会报错。
- 要是你不在乎键的顺序,只想快速添加键值对,直接赋值就行:
.hierarchy.structure.newCard_11002 = ["addNewCard_4112"],不过这样新键会被jq按字母顺序排序后放置。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

