この記事は Vim 8.0 Advent Calendar の 4 日目の記事です。
チャンネルやジョブが追加されたのに合わせて、外部と JSON でのやり取りを行うことを想定して、JSON サポートが追加されました。
エンコード/デコードする
json_encode()
と json_decode()
を使うことで、Vim の内部データと JSON 文字列を相互に変換できます。
let obj = {'users': [{'name': 'thinca', 'lang': 'vim'}]}
let json = json_encode(obj)
echo json
" => {"users":[{"lang":"vim","name":"thinca"}]}
echo json_decode(json)
" => {'users': [{'lang': 'vim', 'name': 'thinca'}]}
追加された値
Vim script には、true
/false
などの bool 値や、null
などの値は存在しませんでした。
このままだと JSON と相互に変換するのに支障が出るため、新しくこれらを表す値が追加されました。
v:false
v:true
v:null
v:none
これらによって、bool 値や null を含む JSON も正しく相互変換されます。
let json = '{"is_vimmer":true,"has_free_time":false,"future":null}'
let obj = json_decode(json)
echo obj
" => {'future': v:null, 'is_vimmer': v:true, 'has_free_time': v:false}
echo json_encode(obj)
" => {"future":null,"is_vimmer":true,"has_free_time":false}
js_encode()
js_decode()
チャンネルには JSON モードの他に JS モードがありました。これらに対応する js_encode()
js_decode()
があります。これらは JavaScript のオブジェクトのような形式を扱います。
let js = '{vimmers:["thinca",,],}'
let obj = js_decode(js)
echo obj
" => {'vimmers': ['thinca', v:none]}
echo js_encode(obj)
" => {vimmers:["thinca",,]}
- オブジェクトのキーは必要がなければダブルクォートで囲われません。
- 末尾カンマを許容します。
- 配列内の空の要素(連続するカンマ)を許容し、この場合は
v:none
が使われます。
かなり特殊な値になるので、通常は JSON を使えばよいでしょう。