如何用jq将含值作键的JSON扁平化并转换为CSV格式?
用jq处理嵌套键值JSON转CSV的方案
这问题我熟!这种嵌套的、以值为键的JSON确实有点绕,但用jq的to_entries就能轻松拆解,直接给你能用的命令和详细说明:
最终可用命令
假设你的JSON文件名为input.json,运行以下命令就能得到你想要的CSV输出:
jq -r 'to_entries[] | .key as $country | .value | to_entries[] | [$country, .key, .value] | @csv' input.json
命令拆解(一步步理解为什么这么写)
我把命令拆成几个核心部分,方便你以后复用思路:
to_entries[]:把顶层的JSON对象(比如{"AE": {...}, "AF": {...}})转换成包含key和value的条目数组,遍历每个国家对应的条目。.key as $country:把当前条目的key(也就是国家代码,比如AE)存到变量$country里,后面组合CSV行的时候要用到。.value | to_entries[]:把当前国家对应的运营商对象(比如{"424,2": "Etisalat"})也转换成条目数组,遍历每个运营商的键值对。[$country, .key, .value]:把国家代码、运营商代码、运营商名称三个值组合成一个数组,这就是CSV的一行数据。@csv:jq内置的过滤器,会自动把数组转换成符合CSV规范的字符串——比如带逗号的424,2会被自动加上双引号,避免CSV解析错误。-r:让jq输出原始的字符串(而不是JSON格式的字符串),这样输出就是纯CSV内容,不需要额外处理。
测试验证
用你提供的JSON输入:
{ "AE": { "424,2": "Etisalat", "424,3": "DU" }, "AF": { "412,50": "Etisalat" } }
运行命令后,输出结果完全符合你的期望:
"AE","424,2","Etisalat" "AE","424,3","DU" "AF","412,50","Etisalat"
内容的提问来源于stack exchange,提问作者Rajiv Kanchan
相关产品推荐
相关产品推荐

