Wednesday, 31. October 2018 08:18PM - beautifulzzzz
一、需求
需要在windows上實現一個bat腳本解析json,將json轉換為自己想要的key-value樣式,來壓縮復雜json。
此外為了保證腳本的靈活性,我在json中添加一個bat節點,用於指明需要抽取該json中的哪些節點進行壓縮( 1>某些節點信息沒有用,因此不用提取;2>節點所對應的key太長了,因此可以用新的key替代老的key來壓縮)
二、json例子
json例子如下 a.json:
{
"light": {
"bat": {
"value": [
"/.light.category.value/category/",
"/.light.dmod.value/dmod/",
"/.light.color.r.pin.value/rpin/",
"/.light.color.r.lv.value/rlv/",
"/.light.color.g.pin.value/gpin/",
"/.light.color.g.lv.value/glv/",
"/.light.color.b.pin.value/bpin/",
"/.light.color.b.lv.value/blv/",
"/.light.color.cct_l.pin.value/cct_lpin/",
"/.light.color.cct_l.lv.value/cct_llv/",
"/.light.color.cct_wc.pin.value/cct_wcpin/",
"/.light.color.cct_wc.lv.value/cct_wclv/",
"/.light.other_lamp.min_lum.value/min_lum/",
"/.light.other_lamp.pwmhz.value/pwmhz/"]
},
"cmod": {
"value": "rgbwc"
},
"dmod": {
"value": "pwm"
},
"color": {
"cct_l": {
"pin": {
"value": 6
},
"lv": {
"value": true
}
},
"r": {
"pin": {
"value": 7
},
"lv": {
"value": true
}
},
"b": {
"pin": {
"value": 4
},
"lv": {
"value": true
}
},
"g": {
"pin": {
"value": 3
},
"lv": {
"value": true
}
},
"cct_wc": {
"pin": {
"value": 5
},
"lv": {
"value": true
}
}
},
"other_lamp": {
"min_lum": {
"value": 10
},
"pwmhz": {
"value": 8000
}
},
"ickind": {
"value": "tlsr8266"
},
"category": {
"value": "0501"
}
}
}
三、bat腳本
解析腳本為 a.bat:
該腳本首先從a.json中讀取bat的值:
1)這里不直接用.light.bat.value的原因是:light關鍵詞可能是其他值,因此需要采用特殊的寫法進行模糊匹配;
2)這里使用bat的FOR的用法,比較復雜,其中:delims=/ tokens=2,3的意思是每次執行jq-win64.exe...的命令返回的每一行,通過/分割為多列,取其中的第2、3列賦值給%%I和%%J;
3)mzip是讀取文件的多行,並輸出一行字符串;
@echo off
setlocal enabledelayedexpansion
set out_file=config.bin
echo {> %out_file%
for /F "delims=/ tokens=2,3" %%I in ('jq-win64.exe ".[] | .bat.value[]" a.json') do (
echo %%I
echo %%J
call:fjq %%I %%J
)
echo }>> %out_file%
cat %out_file%
call:mzip
cat %out_file%
pause
goto:eof
:fjq
echo %2:>> %out_file%
jq-win64.exe %1 a.json>> %out_file%
echo ,>> %out_file%
goto:eof
:mzip
set "Str="
for /f "delims=" %%b in (%out_file%) do (
set "Str=!Str!%%~b"
)
>tmp$ echo !Str!
move /y tmp$ "%out_file%" >nul
goto:eof
四、總結
本文主要運用了:windows的bat腳本技術、jq解析json技術、動態腳本技術。
- BAT FOR循環的用法
- BAT 函數的用法
- BAT 讀取文件的多行,合並為一行字符串輸出
- jq對json的模糊匹配
- 動態腳本
@beautifulzzzz
智能硬件、物聯網,熱愛技術,關注產品
博客:http://blog.beautifulzzzz.com
園友交流群:414948975