如何使用保持数组结构的jq在tsv中转换带有数组的JSON?

时间:2019-03-20 14:08:06

标签: json csv jq

我需要获取mysql表的内容,该表具有一些将数据存储为JSON数组的字段,并将其提取到另一个数据库表中。我需要为此使用REST API,并且它以JSON返回记录。出于性能原因,我需要将该输出作为Tab选项卡返回。因此,我使用jq的@tsv。

这很有效,直到遇到内部具有JSON数组的字段,然后jq抱怨“数组在csv行中无效”。

这是一个JSON示例

{
"records": [
 {
        "id": 1,
        "metadata": {
            "description": null,
            "width": 0,
            "height": 0,
            "secondaryColor": "#fff",
            "callToAction": [
                {
                    "link": "/truc.html",
                    "value": "nice",
                    "colors": {
                        "primary": "transparent;",
                        "secondary": "transparent;"
                    }
                }
            ]
        },
        "parent": null
    }
        ]
}

我想要以下结果

1  null  0  0  #fff  [ { "link": "/truc.html", "value": "nice", "colors": { "primary": "transparent;", "secondary": "transparent;" } } ]  null

所以基本上我希望数组是完整的,但只返回一行

所以我写了这个

jq -c --raw-output '.records[]|[.id,.metadata.description,.metadata.width,.metadata.height,.metadata.secondaryColor,.metadata.callToAction,.parent]|@tsv

但是我有“ csv行中的数组无效”错误

有可能吗?

谢谢

2 个答案:

答案 0 :(得分:1)

您需要先对号召性用语进行JSON编码。

(void *) -1

答案 1 :(得分:0)

由于所述目标在输出中包括“ null”,因此您可能要考虑使用tojson映射所有选定的值,例如使用map(tojson)。使用示例JSON,将产生:

1   null    0   0   "#fff"  [{"link":"/truc.html","value":"nice","colors":{"primary":"transparent;","secondary":"transparent;"}}]   null

不过,请注意,引用了字符串#fff。如果您不希望以这种方式对字符串加引号,则不妨考虑:

map(if type == "string" then . else tojson end)