解析bat文件中的JSON

Parse JSON in bat file

我正在批处理文件中调用 curl 命令。该请求给了我一个 JSON 响应。我将 JSON 响应存储在文件中。我想知道如何解析此 JSON 并获取特定属性?

test.bat

%comspec% /c curl -L -c cookie -b cookie -X POST -H "Accept: application/json" -s -d "{\"id\":\"123456789\",\"part\":\"part\",\"duration\":1400}" https://abcd.com > MyIP.txt
set /p string1=<MyIP.txt

以上工作正常并将 JSON 存储在文件中。虚拟响应如下所示:

{"aki":"abcd", "assumed":"cdef", "expiration":12345, "sa":"temp/abcdefgh", "st":"abcd+/00'nget"}

我需要从此响应中获取 'aki' 和 'sa' 变量并将它们存储到另一个文件中。

考虑到 Gerhard 的评论,这里有一个 hack 旨在仅处理您提交的内容 MyIP.txt

@For /F "Delims==" %%G In ('"(Set $) 2>NUL"') Do Set "%%G="
@For /F "UseBackQ Tokens=1 Delims={}" %%G In ("MYIP.txt") Do @For %%H In (%%G
 ) Do @For /F Tokens^=1-2^ Delims^=:^" %%I In ("%%~H") Do @Set "$%%I=%%J"
@(Set $ 2>NUL) && Pause

最后一行将简单地向您显示它定义的所有变量,(应该是您的每个密钥对)

如果您只想 show/use 其中两个,在本例中为 akisa,那么最后一行可以相应地更改:

@For /F "Delims==" %%G In ('"(Set $) 2>NUL"') Do Set "%%G="
@For /F "UseBackQ Tokens=1 Delims={}" %%G In ("MYIP.txt") Do @For %%H In (%%G
 ) Do @For /F Tokens^=1-2^ Delims^=:^" %%I In ("%%~H") Do @Set "$%%I=%%J"
@Echo %$aki% & Echo %$sa% & Pause

I tried one met honed in the thread you shared, but the output is coming as empty:

这正是不建议在没有适当工具的情况下以纯 cmd/批处理方式执行此操作的原因。

虽然您评论中的代码和 JSON 确实有效...

ECHO %other% %year% %value% %time%
1234 2016 str 05:01

...给您带来麻烦的其中一件事是您原始 JSON 响应 ("abcd+/00'nget") 中的单引号。您必须转义所有必要的字符才能完成这项工作。像 这样正确处理 JSON 的工具可以向您展示:

ECHO {"aki":"abcd","assumed":"cdef","expiration":12345,"sa":"temp/abcdefgh","st":"abcd+/00'nget"} | ^
  xidel - -se "string:=$json" --output-format=cmd
SET string={^"aki^": ^"abcd^"^, ^"assumed^": ^"cdef^"^, ^"expiration^": 12345^, ^"sa^": ^"temp/abcdefgh^"^, ^"st^": ^"abcd+/00'nget^"}

因此以下方法可行:

SET string={^"aki^": ^"abcd^"^, ^"assumed^": ^"cdef^"^, ^"expiration^": 12345^, ^"sa^": ^"temp/abcdefgh^"^, ^"st^": ^"abcd+/00'nget^"}
SET string=%string:"=%
SET "string=%string:~1,-1%"
SET "string=%string:: ==%"
SET "%string:, =" & set "%"

ECHO %aki% %sa%
abcd temp/abcdefgh

但是我建议从一开始就使用

xidel -s ^
-H "Cookie: [...]" -H "Accept: application/json" ^
-d "{{\"id\":\"123456789\",\"part\":\"part\",\"duration\":1400}}" ^
https://abcd.com ^
-e "$json" -e "$json/(aki,sa)"
{
  "aki": "abcd",
  "assumed": "cdef",
  "expiration": 12345,
  "sa": "temp/abcdefgh",
  "st": "abcd+/00'nget"
}
abcd
temp/abcdefgh

(不是 100% 确定,因为我显然无法测试)