LoginSignup
16
7

More than 5 years have passed since last update.

Vim 8.0 Advent Calendar 4 日目 JSON サポート

Posted at

この記事は 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 を使えばよいでしょう。

16
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
7