找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 36369|回复: 4

[网络工具] 批处理JSON解析器

[复制链接]
发表于 2015-1-27 19:49:22 | 显示全部楼层 |阅读模式
本帖最后由 caruko 于 2015-1-27 19:50 编辑

平时 经常使用curl+fiddler,进行一些操作..
也经常遇到服务器的JSON,一般遇到 返回 json  都是直接 findstr + for token 截取想要的数据。

今天突然萌生一个想法,批处理能否解析 JSON ?  考虑了一上午,感觉还是可行的。

下午 经历了 数个版本
1、token=1*   嵌套call 方案
2、层次标记方案


最终诞生了以下 代码,基本上解析 JSON是没有问题了,更深层次没有测试。
  1. @echo off&setlocal ENABLEDELAYEDEXPANSION
  2. for /f "delims=" %%a in (json.js) do set #json=!#json!%%a
  3. set #json=!#json: =!
  4. set #json=!#json:"=!
  5. set #json=!#json:{= { !
  6. set #json=!#json:}= } !
  7. set #json=!#json:[= [ !
  8. set #json=!#json:]= ] !
  9. set "#prefix#="
  10. set /a #arr=-1,#lv=0
  11. for %%a in (!#json!) do (
  12.         for /f "tokens=1 delims={}[]" %%K in ("%%~a") do (
  13.                 for /f "tokens=1,2 delims=:" %%A in ("%%~a") do (
  14.                         if "%%~A"=="%%~a" (
  15.                                 if defined arr_!#lv! set /a #arr+=1&echo,!#prefix#![!#arr!]=%%A
  16.                         )
  17.                         if "%%~A:"=="%%~a" set #prefix#=!#prefix#!.%%A
  18.                         if not "%%~A"=="%%~a" if not "%%~A:"=="%%~a" echo,!#prefix#!.%%A=%%B
  19.                 )
  20.         )
  21.         if "%%~a"=="{" (
  22.                 if defined arr_!#lv! set /a #arr+=1
  23.                 setlocal
  24.                 if defined arr_!#lv! set #prefix#=!#prefix#![!#arr!]
  25.                 set /a #lv+=1
  26.         )
  27.         if "%%~a"=="}" (
  28.                 endlocal
  29.         )
  30.         if        "%%~a"=="]" (
  31.                 endlocal
  32.         )
  33.         if "%%~a"=="[" (
  34.                 setlocal
  35.                 set /a #lv+=1,#arr=-1
  36.                 set arr_!#lv!= +
  37.         )
  38. )
复制代码
提供测试JSON
  1. {"result":[{"rank":1,"name":"super","sum":498700},{"rank":2,"name":"\u6c34\u997a","sum":498700},{"rank":3,"name":"admin","sum":498650},{"rank":4,"name":"\u9e23","sum":472850},{"rank":5,"name":"\u6842\u5c0f\u8d85","sum":320350},{"rank":6,"name":"\u5434","sum":169150},{"rank":7,"name":"\u67e0\u6aac","sum":154600},{"rank":8,"name":"\u817e\u5c0f\u4fca\u5b50","sum":153700},{"rank":9,"name":"chs","sum":44000},{"rank":10,"name":"\u5510\u971e","sum":36700}],"max":498700,"rank":1,"page":1,"success":true}

  2. {
  3. "name":"中国",
  4. "province":[
  5. {
  6. "name":"黑龙江",
  7. "cities":{
  8. "city":["哈尔滨","大庆"]
  9. }
  10. },
  11. {
  12. "name":"广东",
  13. "cities":{
  14. "city":["广州","深圳","珠海"]
  15. }
  16. },
  17. {
  18. "name":"台湾",
  19. "cities":{
  20. "city":["台北","高雄"]
  21. }
  22. },
  23. {
  24. "name":"新疆",
  25. "cities":{
  26. "city":["乌鲁木齐"]
  27. }
  28. }
  29. ]
  30. }
复制代码

评分

参与人数 1技术 +1 收起 理由
CrLf + 1 卧槽,服你了

查看全部评分

 楼主| 发表于 2015-2-1 09:20:38 | 显示全部楼层
因为setlocal 的原因,不能直接保存变量,所以采用echo输出的方式。
用for + call 读取输出,再直接 set 即可..

解析JSON对于大部分人来说没有什么用处,但是如果研读代码,可以帮你大家认识到 setlocal ,endlocal 的强大。
除了近一半的 JSON 格式预处理,核心解析部分并不多,使用高级语言来解析JSON,代码量还要更多。

不过批处理也有缺陷,那就是 KEY:VALUE 不能包含【{}[]:,空格><】 等字符。
发表于 2015-12-11 16:51:34 | 显示全部楼层
卧槽,没想到还真找到这个解析器了,楼主太牛了,膜拜
发表于 2023-3-28 17:29:27 | 显示全部楼层
楼主威武!
查遍全网,都是一些不完善的混合js或vbs的,各种报错、bug、反应慢。
在stackoverflow.com也没有大神给出类似代码。
发表于 2023-3-28 22:02:48 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 23:02 , Processed in 0.017956 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表