使用jq为嵌套JSON数组非空任务新增父级ID字段sId的实现问题
正确的jq处理语句如下:
jq 'map(.id as $s_id | .tasks[]? |= (. + {"sId": $s_id}))' file.json
原代码的问题说明:
- 你使用
.tasks[0]仅能选中tasks数组的第一个元素,无法遍历数组内所有子对象 - 没有提前存储外层父对象的id值,赋值语句
.sId = .id中上下文指向的是当前子任务对象,所以取到的是任务自身的id而非外层父id - 管道逻辑直接将外层父对象替换为修改后的任务对象,会丢失外层的id、tasks等原有字段
语句逻辑解释:
map(...)遍历外层JSON数组的所有元素,处理完成后保留原数组结构返回.id as $s_id将当前遍历到的外层父对象的id值存储为变量$s_id,避免后续上下文切换后无法拿到该值.tasks[]? |= (...)遍历tasks数组的所有子元素执行修改,?为安全操作符,遇到空tasks数组时不会抛出错误. + {"sId": $s_id}为每个任务子对象新增sId字段,值为提前存储的父对象id,同时保留任务本身的所有原有字段
内容的提问来源于stack exchange,提问作者MeanOtter
相关产品推荐
相关产品推荐

