Vimでjsonをeval
VimスクリプトでJSON APIを公開しているwebサービスの内容を取得しようとしています.
調べた感じでは ココ->意外と知られていないvimのtips(vimでJSONを解釈してみる)の方法が簡単そうです.
やってる内容は,
Vimの辞書型データが(多分偶然)JSONの表記とそっくりなことを利用して,
JSのように*1evalして値を取得するという方法です.
一応以下にコピペ(+コメントを追加)
function! GetJson(url) " エンコーディングの設定を退避 let org = &enc " utf-8モードに設定 let &enc = "utf-8" " curlでwebサイトの内容を持ってくる let ret = system("curl -k -u user:pass -s \"" . a:url . "\"") " うにこーどをアンエスケープ let ret = substitute(ret, '\\u\([0-9a-zA-Z]\{4\}\)', '\=nr2char("0x".submatch(1))', 'g') " evalして文字列->値に変換 exe "let val = " . iconv(ret, "utf-8", org) " エンコーディングの設定を復元 let &enc = org return val endfunction
なんですがこれはJSONのデータとして'null'が含まれているとエラーになるです.
なぜならVimスクリプトには'null'という値が無いから….
したがってevaった時点でnullがVimスクリプトの値として定義されていればよい(ハズ!)
function! GetJson(url) let org = &enc " nullをあらかじめ定義 let null = [] let &enc = "utf-8" let ret = system("curl -k -u user:pass -s \"" . a:url . "\"") let ret = substitute(ret, '\\u\([0-9a-zA-Z]\{4\}\)', '\=nr2char("0x".submatch(1))', 'g') exe "let val = " . iconv(ret, "utf-8", org) let &enc = org return val endfunction
これで一応エラーで無くなりました\(^o^)/
nullに対応する値は何にするのがよさげなんでしょうか?
*1:JS知らんけど