使用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 播放列表
如何使用 jq 从复杂的 JSON 文件中获取简单的 JSON 数据文件