jq错误:“对象不在CSV行中有效”。

6
我正在使用jq将嵌套的.json文件转换为.csv,但是,当我有一个特定的时,似乎存在问题。我正在使用的脚本来自这个答案,如果我从输入文件中删除一行,它可以工作。 错误:
jq: error (at example.json:0): object ({"favicon":...) is not valid in a csv row

错误信息不是很具体,因为它提到的对象似乎并不是罪魁祸首。 json2csv.jq
paths as $path
| {path: $path, value: getpath($path)}
| select(.value|type == "object" )
| select( [.value[]][0] | type != "object")
| .path + ([.value[]])
| @csv

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
  }
}

从 JSON 中删除以下内容不会导致 jq 抛出错误:
, "url": "https://example.com/image.png?version=1"

调用:

$ jq -er -f json2csv.jq example.json

我不能真正地改变.json文件,因为它需要有问题的那一行,所以我正在寻找来自jq的解决方案。


请遵循 [mcve] 指南,通过描述和/或展示预期输出(最好两者兼备)来说明问题。 - peak
@peak:以上全是示例;输出并不重要,因为我可以根据需要进行调整。错误才是问题,如果过不了这一关,我就得不到输出。 - l'L'l
@peak:太好了!如果你想把那个作为答案发出来,并解释一下为什么另一种方法失败了,我会很乐意接受的,谢谢。 - l'L'l
1个回答

10

@tsv@csv都要求其输入为扁平数组(即原子值的数组)。有许多(无限多?)方法可以“扁平化”对象和数组,因此如果不知道你的期望,我只能猜测。

如果你想瞎猜的话,请将.path + [.value[]]替换为

.path + [.value[]|tostring]

假设输入的是有效的JSON,这个方法至少总是可行的,同时生成易于阅读的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接