使用jq从JSON文件中提取信息,并将信息设置在变量中

时间:2018-11-05 02:38:10

标签: json batch-file

我想从一个名为blablabla.json的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 :(得分:0)

通常,您会使用For /F循环:

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

可以使用变量%Expiry%访问结果的位置。 (您不会将变量设置为现有的重要系统变量的名称)

要根据当前日期检查它,您需要找到一种方法,因为两个日期都是字符串,而不是日期对象。 这超出了此问题的范围

答案 1 :(得分:0)

出于以下几个原因,我将为此使用PowerShell(至少作为一种工具):

  1. 它直接支持json
  2. 它具有[datetime]类型进行计算

这一行PowerShell脚本返回的到期时间为今天,与今天(包括UTC的转换)相差一天。

<SLM:stylesheet>
<SLM:system>
    <SLM:module name="Category-A">
        <SLM:member state="stateless">a1</SLM:member>
        <SLM:member state="stateless">a2</SLM:member>
        <SLM:member state="stateless">a3</SLM:member>
        <SLM:member state="stateless">a4</SLM:member>
        <SLM:member state="stateless">a5</SLM:member>
        <SLM:member state="stateless">a6</SLM:member>
    </SLM:module>
</SLM:system>

并且可以轻松地分批包装。

(([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

,过去日期为负值,未来日期为正值。

答案 2 :(得分:0)

是的,我知道出于多种原因,不应通过批处理文件处理.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

答案 3 :(得分:0)

使用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