Использование jq для объединения нескольких файлов JSON - PullRequest
0 голосов
/ 10 октября 2018

Во-первых, я не эксперт по файлам JSON или JQ.Но вот моя проблема:

Я просто пытаюсь загрузить данные карты (для карточной игры MtG) через API, поэтому я могу использовать их в своих электронных таблицах и т. Д.

Картаданные из 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, но не могу заставить его работать.Я думаю, что это может быть потому, что в этом случае данные находятся на каком-то дополнительном уровне, так как есть некоторая базовая информация, тогда категория «данные» находится под ней.Я не знаю.

В любом случае, любая помощь в том, как это сделать, была бы признательна.Я не знаю много об этом, но я могу учиться быстро, поэтому даже любые указатели были бы хорошими.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Просто чтобы обеспечить закрытие, @peak предоставил решение.Я использую его в сочетании с методом, найденным здесь для использования подстановочных знаков в пакетных файлах для адресации нескольких файлов.Код выглядит следующим образом:

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.

Еще раз спасибо!

0 голосов
/ 10 октября 2018

Чтобы объединить элементы .data всех ответов в первый ответ, вы можете выполнить:

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

Альтернативы

Вы можете использовать следующий фильтр вместе с -nопция командной строки:

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

Или, если вы просто хотите получить объект вида {"data": [ ... ]}, то (опять-таки, при условии, что вы вызываете jq с параметром командной строки -n) будет достаточно следующего фильтра jq:

{data: [inputs.data] | add}
...