Извлеките информацию из файла JSON с помощью jq и установите информацию в переменной - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу извлечь информацию из файла JSON с именем blablabla.json, который выглядит следующим образом:

{
  "token": {
   "issued_at": "2018-11-04T23:35:07Z",
   "expires_at": "2018-11-05T00:35:07Z",
   "user": {
    "id": "ide",
    "name": "ide"
   }
  }
}

Я хочу получить дату "expires_at", чтобы сравнить ее с текущей датой. Для этого я использую это:

type blablabla.json|jq .token".expires_at"

Это работает, но я не знаю, как установить его в переменную. Я пробую что-то вроде:

SET date=type blablabla.json|jq .token".expires_at"

но это ничего не делает. У вас есть идея?

Большое спасибо.

Ответы [ 4 ]

0 голосов
/ 07 января 2019

С Xidel это так же просто, как:

xidel -s blablabla.json -e "$json//expires_at"

Возвращает значение: 2018-11-05T00:35:07Z.

Чтобы экспортировать это как %expdate%:

FOR /F "delims=" %%A IN ('xidel.exe -s blablabla.json -e "expdate:=$json//expires_at" --output-format=cmd') DO %%A

Xidel также может вернуть текущую дату в том же формате:

xidel -s blablabla.json -e "$json//expires_at,current-dateTime()"

Возвращает:

2018-11-05T00:35:07Z
2019-01-07T18:26:33.453
0 голосов
/ 05 ноября 2018

Я бы использовал PowerShell для этого (по крайней мере, в качестве инструмента) по нескольким причинам:

  1. имеет прямую поддержку JSON
  2. имеет тип [datetime] для расчетов

Этот однострочный скрипт PowerShell возвращает expires.at как дневное отличие от сегодняшнего дня, включая преобразование из UTC.

(([datetime](Get-Content .\blablabla.json |ConvertFrom-Json).token.expires_at).Date - (Get-Date).date).Days

И может быть легко упакован в партию.

@Echo off
For /f %%A in ('
powershell -NoP -C "(([datetime](Get-Content .\blablabla.json |ConvertFrom-Json).token.expires_at).Date - (Get-Date).date).Days"
') Do Set "Expires=%%A"
Set Expires

Это вернет (на сегодня):

Expires=0

и отрицательные значения для прошлых дат, положительные значения для будущих дат.

0 голосов
/ 05 ноября 2018

Да, я знаю, что файл .json не должен обрабатываться через пакетный файл по большому количеству причин. Однако, если проблема проста (как эта) и нет дополнительных ограничений, то решение для пакетного файла может быть самым простым, как этот двухстрочный код, который включает сравнение дат ...

for /F "tokens=2 delims=, " %%a in ('findstr "expires_at" blablabla.json') do set "expires=%%~a"
if %expires:~0,4%%expires:~5,2%%expires:~8,2% geq %date:~6,4%%date:~0,2%%date:~3,2% goto expired
0 голосов
/ 05 ноября 2018

Обычно вы используете цикл For /F:

@Echo Off
For /F "Delims=" %%A In ('type blablabla.json^|jq .token".expires_at"'
) Do Set "Expiry=%%~A"

Где ваш результат может быть доступен с помощью переменной, %Expiry%. (Вы бы не присвоили переменной имя существующей существующей системной переменной) .

Что касается сравнения с текущей датой, вам нужно найти способ сделать это, поскольку обе даты будут строками, а не объектами даты. Это выходит за рамки этого вопроса .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...