jq 错误“对象在 csv 行中无效”

l'L*_*L'l 3 csv bash json jq

我正在使用jq将嵌套.json文件转换为.csv,但是,当我在JSON 中有特定的,时似乎存在问题。我使用的脚本来自这个答案,如果我从输入文件中删除一行,它就可以工作。

错误

jq: error (at example.json:0): object ({"favicon":...) is not valid in a csv row
Run Code Online (Sandbox Code Playgroud)

错误消息不是很具有描述性,因为它提到的对象似乎不是罪魁祸首。

json2csv.jq

paths as $path
| {path: $path, value: getpath($path)}
| select(.value|type == "object" )
| select( [.value[]][0] | type != "object")
| .path + ([.value[]])
| @csv
Run Code Online (Sandbox Code Playgroud)

example.json(通过https://jsonlint.com验证):

{
  "items": [
    {
      "id": 1234,
      "title": "Title of Item",
      "internet": {
        "favicon": "https://example.com/icon.png",
        "domain": "https://example.com"
      },
      "image": {
        "gif": null,
        "main": "https://example.com/image_large.png"
      },
      "description": {
        "origin": null,
        "resource": null
      },
      "referral": {
        "owner": null,
        "name": null
      },
      "url": "https://example.com/image.png?version=1"
    }
  ],
  "other": {
    "data": 0,
    "notes": 1,
    "total": 1,
    "misc": 1
  }
}
Run Code Online (Sandbox Code Playgroud)

JSON中删除以下内容不会引发错误jq

, "url": "https://example.com/image.png?version=1"
Run Code Online (Sandbox Code Playgroud)

调用

$ jq -er -f json2csv.jq example.json
Run Code Online (Sandbox Code Playgroud)

我无法真正更改.json文件,因为它需要有问题的行,所以我正在寻找jq.

pea*_*eak 7

二者@tsv@csv要求其输入为平坦的阵列(即,原子值数组)。有很多(无限多?)“扁平化”对象和数组的方法,所以在不知道你期望什么的情况下,我只是在胡乱猜测。

如果你想要一个疯狂的猜测,替换.path + [.value[]]

.path + [.value[]|tostring]
Run Code Online (Sandbox Code Playgroud)

至少这将始终有效(假设输入是有效的 JSON),同时产生易于阅读的结果。