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

问题描述 投票:0回答:2

我需要获取一个mysql表的内容,该表包含一些将数据存储为JSON数组的字段,并将其提取到另一个数据库表中。我需要使用REST API,它返回JSON中的记录。出于性能原因,我需要将输出作为选项卡选项卡返回。因此我使用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行中无效”错误

那可能吗 ?

谢谢

json csv jq
2个回答
1
投票

您需要首先对call-to-action进行JSON编码。

% jq -c --raw-output '.records[] |
[.id, .metadata.description, 
      .metadata.width,
      .metadata.height,
      .metadata.secondaryColor,
      (.metadata.callToAction|@json),  # convert this field to JSON first
      .parent
] | @tsv' tmp.json
1       0   0   #fff    [{"link":"/truc.html","value":"nice","colors":{"primary":"transparent;","secondary":"transparent;"}}]

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)
© www.soinside.com 2019 - 2024. All rights reserved.