Wednesday, 31. October 2018 08:18PM - beautifulzzzzjson
須要在windows上實現一個bat腳本解析json,將json轉換爲本身想要的key-value樣式,來壓縮複雜json。windows
此外爲了保證腳本的靈活性,我在json中添加一個bat節點,用於指明須要抽取該json中的哪些節點進行壓縮( 1>某些節點信息沒有用,所以不用提取;2>節點所對應的key太長了,所以能夠用新的key替代老的key來壓縮)
函數
json例子以下 a.json:code
{ "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" } } }
解析腳本爲 a.bat:blog
該腳本首先從a.json中讀取bat的值:
1)這裏不直接用.light.bat.value的緣由是:light關鍵詞多是其餘值,所以須要採用特殊的寫法進行模糊匹配;token
2)這裏使用bat的FOR的用法,比較複雜,其中:delims=/ tokens=2,3的意思是每次執行jq-win64.exe...的命令返回的每一行,經過/分割爲多列,取其中的第二、3列賦值給%%I和%%J;ip
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技術、動態腳本技術。iframe
@beautifulzzzz 智能硬件、物聯網,熱愛技術,關注產品 博客:http://blog.beautifulzzzz.com 園友交流羣:414948975