如何使用jq递归转换任意JSON文件为指定结构?
用JQ递归转换JSON为指定结构
完全可以用JQ实现这个需求,核心思路是通过递归函数遍历JSON的每一层结构,将键值对转换为你需要的{name, type, value}格式,同时处理嵌套的对象和数组。
核心JQ脚本
def transform: if type == "object" then to_entries | map({ name: .key, type: (.value | type), value: (.value | transform) }) elif type == "array" then map(transform) else . end; transform
脚本说明
- 递归函数
transform:负责处理不同类型的JSON值:- 当值为
object类型时,先用to_entries将对象转为{key, value}的条目数组,再映射为目标格式,其中value字段会递归调用transform处理嵌套对象。 - 当值为
array类型时,对数组中的每个元素递归执行transform,保持数组结构的同时处理内部嵌套。 - 对于字符串、数字、布尔值、null等基础类型,直接返回原值作为
value字段。
- 当值为
示例用法
假设你有如下输入JSON文件input.json:
{ "name": "Alice", "age": 30, "active": true, "address": { "street": "Main St", "zip": 12345 }, "hobbies": ["reading", {"type": "outdoor", "frequency": "weekly"}] }
运行命令(将脚本保存为transform.jq后执行):
jq -f transform.jq input.json
输出结果
[ { "name": "name", "type": "string", "value": "Alice" }, { "name": "age", "type": "number", "value": 30 }, { "name": "active", "type": "boolean", "value": true }, { "name": "address", "type": "object", "value": [ { "name": "street", "type": "string", "value": "Main St" }, { "name": "zip", "type": "number", "value": 12345 } ] }, { "name": "hobbies", "type": "array", "value": [ "reading", [ { "name": "type", "type": "string", "value": "outdoor" }, { "name": "frequency", "type": "string", "value": "weekly" } ] ] } ]
自定义调整
如果需要将数组中的基础类型也转换为{name, type, value}格式(比如数组元素没有键名,可设name为索引或固定值),可以修改数组分支的逻辑,例如:
elif type == "array" then map( if type == "object" or type == "array" then transform else {name: null, type: type, value: .} end )
内容的提问来源于stack exchange,提问作者urbanSoft
相关产品推荐
相关产品推荐

