使用jq组合多个JSON文件

Posted

技术标签:

【中文标题】使用jq组合多个JSON文件【英文标题】:Using jq to combine multiple JSON files 【发布时间】:2019-03-14 18:18:40 【问题描述】:

首先,我不是 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",
      ......
    
  ]

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

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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

jq 'reduce inputs.data as $s (.; .data += $s)' page1.json page2.json ...

替代方案

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

reduce inputs as $s (input; .data += ($s.data))

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

data: [inputs.data] | add

【讨论】:

嗨!您提供的第一个解决方案完美运行,谢谢!【参考方案2】:

只是为了提供关闭,@peak 提供了解决方案。我将它与here 找到的方法结合使用,用于在批处理文件中使用通配符来处理多个文件。现在的代码如下所示:

set expanded_list=
for /f "tokens=*" %%F in ('dir /b /a:-d "All Cards\!setname!_*.json"') do call set expanded_list=!expanded_list! "All Cards\%%F"
jq-win32 "reduce inputs.data as $s (.; .data += $s)" !expanded_list! > "All Cards\!setname!.json"

每个卡片组的所有单独页面都命名为“setname”_“pagenumber”.json

代码找到每一组的所有页面,并将它们组合成一个变量,我可以将其传递给 jq。

再次感谢!

【讨论】:

以上是关于使用jq组合多个JSON文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 MediaInfo 命令行和 jq 从文件目录构建有效的 JSON 播放列表

vue如何将一个json文件传到另一个

如何使用 jq 从复杂的 JSON 文件中获取简单的 JSON 数据文件

使用 jq 从 JSON 文件中递归获取键名

如何使用 jq 合并来自 2 个文件的 2 个 JSON 对象?

使用 jq 或替代命令行工具比较 JSON 文件