如何用JQ遍历数组对象生成新JSON?处理tshark多值帧输出
解决JQ解析tshark多值帧JSON的问题
嘿,针对你用JQ处理tshark -ek输出的JSON需求,我整理了一个靠谱的解决方案,能完美处理单元素数组和多元素数组的拆分:
核心思路
我们需要:
- 先确定需要遍历的索引数(由多元素数组的长度决定,假设所有多元素数组长度一致,从你的示例来看是符合的)
- 遍历每个索引,为每个索引生成一个独立的JSON对象:
- 单元素数组:始终取唯一的那个元素,保持单元素数组格式
- 多元素数组:取对应索引的元素,包装成单元素数组
针对不同输入结构的JQ命令
情况1:输入有layers嵌套(比如你的示例1)
使用这条命令:
.layers as $layers | $layers | to_entries | map(select(.value | length > 1)) | .[0].value | indices(true) as $indices | $indices[] | reduce $layers | to_entries[] as {$key, $value} ( {}; .[$key] = [$value[.]] )
情况2:输入是顶层字段(比如你的示例2)
简化命令为:
. as $obj | $obj | to_entries | map(select(.value | length > 1)) | .[0].value | indices(true) as $indices | $indices[] | reduce $obj | to_entries[] as {$key, $value} ( {}; .[$key] = [$value[.]] )
命令解释
让我拆解下关键部分:
to_entries:把JSON对象转换成键值对数组,方便遍历每个字段map(select(.value | length > 1)):筛选出所有多元素数组的字段.[]value | indices(true):获取第一个多元素数组的索引列表(比如长度为2的数组会得到[0,1])reduce ...:遍历每个字段,将对应索引的元素提取出来,包装成单元素数组赋值给新对象的对应键
测试验证
把示例1的输入喂给第一条命令,会输出你期望的两个独立JSON对象;示例2的输入喂给第二条命令,会输出5个符合要求的对象,完全匹配你的期望输出。
注意事项
这个方案默认所有多元素数组的长度是一致的,如果你的实际数据存在长度不一致的情况,可以告诉我,我们再调整逻辑来处理这种边缘场景~
内容的提问来源于stack exchange,提问作者Roberto
相关产品推荐
相关产品推荐

