我有以下代表数据库模式的 JSON 结构:
{
"db": [
{
"tables": [
{
"name": "tblFoo",
"cols": [
{
"name": "created",
"types": [ { "data_type": "timestamp" } ]
},
{
"name": "updated",
"types": [ { "data_type": "timestamp" } ]
},
{
"name": "username",
"types": [ { "data_type": "timestamp" } ]
}
]
},
{
"name": "tblBar",
"cols": [
{
"name": "created",
"types": [ { "data_type": "timestamp" } ]
},
…
等等,你明白了。我需要将其转换为一组连续的 json“命令”,其中每个表及其列都是单独的一行,如下所示:
[
{"type": "TABLE", name:"tblFoo"},
{"type": "COLUMN", name:"created", ofTable: "tblFoo"},
{"type": "COLUMN", name:"updated", ofTable: "tblFoo"},
…
{"type": "TABLE", name:"tblBar"},
{"type": "COLUMN", name:"created", ofTable: "tblBar"},
]
我就是想不通。我.db.tables[] | map(…)
一开始尝试过,但这显然只会创建第一级表格的数组,我无法将列定义添加/注入到同一级。
然后,我尝试使用递归运算符等对列进行迭代.db.tables[].cols[]
,但结果列表仍然只是列的列表,并且我无法将表的列表添加/注入到传出列表中。
你能帮助我走上正确的道路吗?
.db
是一个数组,因此您需要.db[]
迭代其项目。.db[].tables[]
足以到达表级别。 对于列,进一步下降到.cols[]
。 无需更深入(或使用递归下降),因为您只需要相应的.name
值。演示
请注意,jq 致力于逻辑处理 JSON 数据,因此其格式化功能有限。您基本上有两个选择:漂亮打印的输出(见上文),或压缩的输出,其中删除了所有不重要的空白字符(包括换行符)。您可以通过使用
--compact-output
(or-c
) 标志应用后者来更接近所需的格式,同时省略外部数组括号以获取 JSON 对象流,每个对象都打印在自己的行上。请注意缺少的外部括号,以及每行(但最后一行)后缺少的逗号。演示
要准确重现所需的格式,您需要手动将其编写为字符串。但这会带来巨大的错误诱发复杂性权衡,因此一般来说不推荐。这是一种方法,使用
--raw-output
(或-r
) 标志从编写的字符串行中剥离 JSON 编码:演示