You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 12:01:27