使用JQ扁平化数组键时出现笛卡尔积问题求助
问题:JSON字段重命名时出现笛卡尔积问题
原始JSON数据:
{ "name": "vehicles", "details": [ { "type": "passenger", "engine": { "type": "electric" } }, { "type": "commercial", "engine": { "type": "diesel" } } ] }
需求是将每个details元素中的engine.type字段重命名为engineType,同时删除原有的engine.type字段。
尝试执行的错误命令:
echo $json|jq '(.details[].engineType = .details[].engine.type)|del(.details[].engine.type)'
得到的错误结果(笛卡尔积输出):
{ "name": "vehicles", "details": [ { "type": "passenger", "engine": {}, "engineType": "electric" }, { "type": "commercial", "engine": {}, "engineType": "electric" } ] } { "name": "vehicles", "details": [ { "type": "passenger", "engine": {}, "engineType": "diesel" }, { "type": "commercial", "engine": {}, "engineType": "diesel" } ] }
解决方法
问题核心在于原始命令中,.details[].engineType = .details[].engine.type会遍历所有details元素的engine.type值,并将每个值赋值给所有details元素的engineType字段,从而产生笛卡尔积。正确的做法是对每个details元素单独处理:
方法1:使用|=操作符逐个处理数组元素
echo "$json" | jq '.details[] |= (.engineType = .engine.type | del(.engine.type))'
方法2:重新构造details数组
echo "$json" | jq '.details = [.details[] | .engineType = .engine.type | del(.engine.type)]'
执行任一命令后,都会得到正确输出:
{ "name": "vehicles", "details": [ { "type": "passenger", "engine": {}, "engineType": "electric" }, { "type": "commercial", "engine": {}, "engineType": "diesel" } ] }
如果希望连空的engine对象也一起删除,可以调整命令为:
echo "$json" | jq '.details[] |= (.engineType = .engine.type | del(.engine))'
输出结果:
{ "name": "vehicles", "details": [ { "type": "passenger", "engineType": "electric" }, { "type": "commercial", "engineType": "diesel" } ] }
内容的提问来源于stack exchange,提问作者Leigh K
相关产品推荐
相关产品推荐

