使用 jq 组合多个 JSON 文件

Jas*_*ska 8 merge json concatenation jq

首先,我不是 JSON 文件或 JQ 方面的专家。但这是我的问题:

我只是想通过 API 下载到纸牌数据(用于 MtG 纸牌游戏),所以我可以在我自己的电子表格等中使用它。

来自 API 的卡片数据以页的形式出现,因为它太多了,我试图在 Windows 中找到一种很好的命令行方法来将文件合并为一个。这将使我能够轻松轻松地将信息用作工作簿中的外部数据。

来自 API 的数据如下所示:

{
  "object": "list",
  "total_cards": 290,
  "has_more": true,
  "next_page": "https://api.scryfall.com/cards/search?format=json&include_extras=false&order=set&page=2&q=e%3Alea&unique=cards",
  "data": [
    {
      "object": "card",
      "id": "d5c83259-9b90-47c2-b48e-c7d78519e792",
      "oracle_id": "c7a6a165-b709-46e0-ae42-6f69a17c0621",
      "multiverse_ids": [
        232
      ],
      "name": "Animate Wall",
      ......
    }
    {
      "object": "card",
      ......
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

基本上,我需要在第一个文件之后从每个文件中取出“数据”部分中的内容,并将其合并到第一个文件中。

我已经尝试了一些使用 jq 在网上找到的示例,但我无法让它工作。我认为这可能是因为在这种情况下,数据在一个额外的级别之下,因为有一些基本信息,那么“数据”类别就在它之下。我不知道。

无论如何,任何有关如何实现这一目标的帮助将不胜感激。我对此知之甚少,但我可以快速学习,因此即使是任何指针都会很棒。

谢谢!

pea*_*eak 10

要将所有响应的 .data 元素合并到第一个响应中,您可以运行:

jq 'reduce inputs.data as $s (.; .data += $s)' page1.json page2.json ...
Run Code Online (Sandbox Code Playgroud)

备择方案

您可以将以下过滤器与 -n 命令行选项结合使用:

reduce inputs as $s (input; .data += ($s.data))
Run Code Online (Sandbox Code Playgroud)

或者,如果您只是想要表单的对象,{"data": [ ... ]}那么(再次假设您使用 -n 命令行选项调用 jq)以下 jq 过滤器就足够了:

{data: [inputs.data] | add}
Run Code Online (Sandbox Code Playgroud)