使用jq处理多类型字段:判断JSON记录是否存在creator
处理JSON中Production字段(对象/数组)并判断Creator存在性
我帮你搞定这个问题!你的核心痛点是Production字段既可能是单个对象,也可能是对象数组,还可能是空对象,需要统一处理后判断是否存在至少一个creator。
完整的jq解决方案
直接用下面的命令就能满足需求,它会统一处理Production的两种结构,输出每个record对应的1(存在creator)或0(不存在):
jq -r '.[].recordList.record[] | # 把Production统一转为数组:如果是对象就包装成数组,数组直接保留 ( .Production | if type == "array" then . else [.] end ) as $prods | # 检查数组中是否有任意一个元素存在creator.name if any($prods[]; .creator.name) then 1 else 0 end' input.json > output.csv
逐行解释逻辑
- 遍历所有record:
.[].recordList.record[]会深入JSON结构,逐个取出每个record条目。 - 统一Production结构:
( .Production | if type == "array" then . else [.] end )是关键——不管Production原本是单个对象还是数组,都转成数组格式,这样后续处理逻辑就一致了。 - 判断creator存在性:
any($prods[]; .creator.name)使用jq的any()函数,只要数组里有一个元素的creator.name存在(非空/非null),就返回true,对应输出1;否则输出0。
测试你的示例JSON
用你给出的示例JSON输入:
[{ "recordList" : { "record" : [{ "Production" : { "creator" : { "name" : "A" } } }, { "Production" : {} }, { "Production" : [{ "creator" : { "name" : "B" }, "creator" : { "name" : "C" } }] }] } }]
执行命令后,输出的CSV内容会是:
1 0 1
完全符合预期:第一个record有creator,第二个没有,第三个数组里有creator。
额外优化点
如果你的JSON里可能存在Production为null的情况,可以在统一数组时加上空值处理:
jq -r '.[].recordList.record[] | ( .Production // [] | if type == "array" then . else [.] end ) as $prods | if any($prods[]; .creator.name) then 1 else 0 end' input.json > output.csv
这里// []会把null或不存在的Production转为空数组,避免报错。
内容的提问来源于stack exchange,提问作者Tine
相关产品推荐
相关产品推荐

