使用jq动态转换JSON结构 递归调整typography节点格式
jq 递归转换JSON结构方案
以下实现无需提前预知除value、type外的任意键名,支持任意嵌套层级的自动匹配转换,不满足匹配规则的内容会完全保留原有状态:
可直接执行的命令(jq 1.6+ 版本,目前大部分环境内置的jq都满足版本要求)
jq ' walk( if type == "object" and has("value") and has("type") and (.value | type) == "object" then .type as $typ | .value | with_entries(.value = {value: .value, type: $typ}) else . end ) ' 你的输入文件路径.json
实现逻辑说明
- 借助jq内置
walk函数递归遍历JSON所有层级的节点,不会遗漏任意嵌套位置的待转换结构 - 节点匹配规则严格对齐需求:仅当节点为对象、同时存在
value和type两个固定键、且value字段对应的值为对象时,才触发转换 - 转换时先缓存当前节点的
type值,再遍历value对象下的所有动态键,将每个键的值包装为{value: 原始属性值, type: 缓存的type值}结构 - 所有不满足匹配规则的节点(数组、原始值、不符合结构的对象)直接原样返回,无任何修改
低版本jq兼容方案(无内置walk时使用)
如果你的环境jq版本低于1.6,使用补全walk定义的完整命令即可:
jq ' def walk(f): . as $node | if type == "object" then reduce keys_unsorted[] as $k ({}; .[$k] = $node[$k] | walk(f)) | f elif type == "array" then map(walk(f)) | f else f end; walk( if type == "object" and has("value") and has("type") and (.value | type) == "object" then .type as $typ | .value | with_entries(.value = {value: .value, type: $typ}) else . end ) ' 你的输入文件路径.json
用提供的示例输入执行上述命令,输出和目标结构完全一致。
内容的提问来源于stack exchange,提问作者phil88
相关产品推荐
相关产品推荐

