首先,我不是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在网上找到的示例,但无法正常工作。我认为可能是因为在这种情况下,数据属于某种附加级别,因为存在一些基本信息,所以“数据”类别位于其下方。我不知道。
无论如何,将对如何实现这一目标的任何帮助表示赞赏。我对此了解不多,但是我可以很快学习,因此即使任何指针都很好。
谢谢!
答案 0 :(得分:3)
要将所有响应的.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}
答案 1 :(得分:0)
只需提供闭包,@ 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。
再次感谢!