Board logo

标题: [网络工具] 批处理JSON解析器 [打印本页]

作者: caruko    时间: 2015-1-27 19:49     标题: 批处理JSON解析器

本帖最后由 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. }
复制代码

作者: caruko    时间: 2015-2-1 09:20

因为setlocal 的原因,不能直接保存变量,所以采用echo输出的方式。
用for + call 读取输出,再直接 set 即可..

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

不过批处理也有缺陷,那就是 KEY:VALUE 不能包含【{}[]:,空格><】 等字符。
作者: 极品小猫    时间: 2015-12-11 16:51

卧槽,没想到还真找到这个解析器了,楼主太牛了,膜拜
作者: pda8888    时间: 2023-3-28 17:29

楼主威武!
查遍全网,都是一些不完善的混合js或vbs的,各种报错、bug、反应慢。
在stackoverflow.com也没有大神给出类似代码。
作者: newswan    时间: 2023-3-28 22:02

json 解析器,https://github.com/alingse/jq-manual-cn




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2