json - 如何在Pure Batch中解析JSon

标签 json parsing batch-file for-loop token

我试图了解批处理文件中的for循环如何使用/ F“ delims =”选项但不带令牌地遍历所有项。我尝试了各种方法,但是失败了。首先,我知道还有其他方法可以读取json文件,但我只想了解如何在不使用任何外部程序jscript jq等的情况下以纯批处理方式进行读取。JSon格式如下所示,但项目数和顺序他们倾向于变化。

{"SomeVariableName": "SomeString", "SomeVariableName": "SomeString", "SomeVariableName": "SomeString", "SomeVariableName": "SomeString"}
{"SomeVariableName": "SomeString", "SomeVariableName": "SomeString", "SomeVariableName": "SomeString", "SomeVariableName": "SomeString"}
{"SomeVariableName": "SomeString", "SomeVariableName": "SomeString", "SomeVariableName": "SomeString", "SomeVariableName": "SomeString"}
{"SomeVariableName": "SomeString", "SomeVariableName": "SomeString", "SomeVariableName": "SomeString", "SomeVariableName": "SomeString"}
etc


但有时可能只是:

"SomeVariableName2": "SomeString2", "SomeVariableName1": "SomeString1",


例如,我已经完成了:

SetLocal DisableDelayedExpansion
For /F "delims=" %%c (file.json) Do(
REM iterate through each line
  set "Line=%%c"
  setlocal EnableDelayedExpansion
  set CR=CRLFCRLF
  Set "LineChange1=!Line:~1,-1!"
  for %%d in ("!CR!") do set LineChange2=!LineChange1:", "=%%~d!
  for %%e in (!LineChange4:CRLFCRLF= !) do set /a numtkns+=1
  REM but don't know how to insert the above numtkns in for options as it seems to require a function.
  set LineChange3=!LineChange2:": "==!
  set LineChange4=!LineChange3:"=!
  set /A Countr+=1
  REM this leaves this current line stored in variable LineChange4 as SomeVariableName=SomeStringCRLFCRLFSomeVariableName=SomeStringCRLFCRLFSomeVariableName=SomeStringCRLFCRLFSomeVariableName=SomeString
  )


或者,我可以使用换行符代替CRLFCRLF:

SetLocal DisableDelayedExpansion
For /F "delims=" %%c (file.json) Do(
REM iterate through each line
set "Line=%%c"
setlocal EnableDelayedExpansion
for /f %%d in ('copy /Z "%~dpf0" nul') do (
 set "CR=%%d"
)
Set "LineChange1=!Line:~1,-1!"
for %%e in ("!CR!") do set LineChange2=!LineChange1:", "=%%~e!
set LineChange3=!LineChange2:": "==!
set LineChange4=!LineChange3:"=!
set /A Countr+=1

)


这导致多行存储在变量LineChange4中:

SomeVariableName=SomeString
SomeVariableName=SomeString
SomeVariableName=SomeString
SomeVariableName=SomeString


如何迭代每个键值对并将每个值分配给与键名称相同的变量。我看过另一篇文章,他们确实设置了var_%SomeVariableName%= SomeString,但它仅适用于第一个键值对,并且我希望它遍历所有项直到最后一个项,即使令牌的数量和顺序有所不同。

编辑:SomeString可能是带有各种字符的标题,因此唯一近似的已知值是SomeVariableName键,这些键通常没有空格。

Edit2:我最初并没有添加,我还使用了“ Set“ LineChange1 =!Line:〜1,-1!”来删除JSon文件通常附带的花括号。

最佳答案

另一种更简单的方法:

@echo off
setlocal EnableDelayedExpansion

rem Read the lines of JSon file, removing braces
for /F "delims={}" %%a in (file.json) do (
   set "line=%%~a"
   rem Process each pair of "variable": "string" values
   for %%b in ("!line:": "==!") do echo SET %%b
)


使用此输入文件:

{"SomeVariableName1": "Some String 1", "SomeVariableName2": "Some&String<2", "SomeVariableName3": "Some>String|3", "SomeVariableName4": "Some  String  4"}
{"SomeVariableName1": "SomeString1", "SomeVariableName2": "SomeString2", "SomeVariableName3": "SomeString3", "SomeVariableName4": "SomeString4"}
{"SomeVariableName1": "SomeString1", "SomeVariableName2": "SomeString2", "SomeVariableName3": "SomeString3", "SomeVariableName4": "SomeString4"}
{"SomeVariableName1": "SomeString1", "SomeVariableName2": "SomeString2", "SomeVariableName3": "SomeString3", "SomeVariableName4": "SomeString4"}


...这是输出:

SET "SomeVariableName1=Some String 1"
SET "SomeVariableName2=Some&String<2"
SET "SomeVariableName3=Some>String|3"
SET "SomeVariableName4=Some  String  4"
SET "SomeVariableName1=SomeString1"
SET "SomeVariableName2=SomeString2"
SET "SomeVariableName3=SomeString3"
SET "SomeVariableName4=SomeString4"
SET "SomeVariableName1=SomeString1"
SET "SomeVariableName2=SomeString2"
SET "SomeVariableName3=SomeString3"
SET "SomeVariableName4=SomeString4"
SET "SomeVariableName1=SomeString1"
SET "SomeVariableName2=SomeString2"
SET "SomeVariableName3=SomeString3"
SET "SomeVariableName4=SomeString4"

关于json - 如何在Pure Batch中解析JSon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51179898/

相关文章:

json - 从 stats.nba.com 发布抓取数据

javascript - 如何将发布/获取 json 值 (html) 发送到 API?

java - Jira API 自动化 - REST Assured

python - 如何使用 lxml 获取元素

regex - 我什么时候应该使用解析器?

javascript - 如何在 Node 中连接两个 JSON 数组对象

ruby-on-rails - Ruby RoR 解析字符串上层

windows - 是否可以从批处理文件启动文件的默认编辑器?

batch-file - 命令/批处理 :userinput inside a for loop

windows - 如何读取存储在文件中 = 符号后的任何文本