如何用batch script解析复杂分支JSON文件并提取指定内容?
方案一:通过完整路径参数提取指定JSON值
原生Batch处理嵌套JSON的局限性很大,推荐结合轻量JSON工具jq实现,以下是可直接使用的批处理脚本:
@echo off setlocal enabledelayedexpansion :: 检查jq是否存在 if not exist "jq.exe" ( echo 请将jq.exe放在当前目录或系统PATH中 exit /b 1 ) :: 构造jq路径表达式,将传入的参数转为.Subtree5.Subtree6.Subtree3.Value2格式 set "jq_path=." for %%a in (%*) do ( set "jq_path=!jq_path!.%%a" ) :: 从data.json中提取目标值,可替换为你的JSON文件名 jq -r "%jq_path%" data.json endlocal
使用方式:
- 执行
parsejson.bat Subtree5 Subtree6 Subtree3 Value2即可直接输出对应路径的值
如果必须用纯Batch(不依赖第三方工具),可参考以下脚本(仅适配格式化后、缩进规范的JSON,复杂结构可能失效):
@echo off setlocal enabledelayedexpansion set "json_file=data.json" set "target_path=%*" set "current_depth=0" set "matched_path=" for /f "delims=" %%a in ('type "%json_file%"') do ( :: 根据空格缩进判断层级(假设每级2个空格) set "line=%%a" set "trimmed=!line:~0,2!" if "!trimmed!"==" " ( set /a current_depth+=1 ) else if "!trimmed!"=="" ( set /a current_depth-=1 ) :: 匹配路径中的每个键 for %%k in (!target_path!) do ( echo !line! | findstr /r "\"%%k\"" >nul if not errorlevel 1 ( set "matched_path=!matched_path! %%k" :: 匹配到最后一个键时提取对应值 if "!matched_path:~1!"=="%target_path%" ( for /f tokens^=2^ delims^=^":^" %%v in ("!line!") do ( echo %%v exit /b 0 ) ) ) ) ) echo 未找到指定路径的值 endlocal
方案二:按一级子文件夹拆分JSON文件
已知6个一级子文件夹名称(假设为Dir1 Dir2 Dir3 Dir4 Dir5 Dir6),用jq可快速实现拆分:
@echo off setlocal enabledelayedexpansion :: 替换为你的一级子文件夹名称列表 set "root_dirs=Dir1 Dir2 Dir3 Dir4 Dir5 Dir6" :: 遍历生成独立JSON文件 for %%d in (%root_dirs%) do ( jq "{\"%%d\": .%%d}" data.json > "%%d.json" echo 已生成%%d.json ) endlocal
纯Batch实现版本(仅适配格式化后的JSON):
@echo off setlocal enabledelayedexpansion set "json_file=data.json" set "root_dirs=Dir1 Dir2 Dir3 Dir4 Dir5 Dir6" for %%d in (%root_dirs%) do ( set "in_block=0" ( for /f "delims=" %%a in ('type "%json_file%"') do ( :: 匹配一级文件夹的起始键 echo %%a | findstr /r "\"%%d\"" >nul if not errorlevel 1 ( set "in_block=1" echo { echo "%%d": %%a ) else if !in_block! equ 1 ( :: 检测块结束标记 echo %%a | findstr /r "^[[:space:]]*}$" >nul if not errorlevel 1 ( echo %%a set "in_block=0" ) else ( echo %%a ) ) ) ) > "%%d.json" echo 已生成%%d.json ) endlocal
内容的提问来源于stack exchange,提问作者Mirco
相关产品推荐
相关产品推荐

