2011年07月07日(木)
YAML を読んで JSON に変換する
JSON は JavaScript の構文なので、自分的には、引用符とか括弧などがちょっと見づらいし書くのが面倒です。
なので、データは YAML で書くこととし、YAML から JSON へスクリプトで変換することにしました。
環境は、Ubuntu Linux 11.04、Ruby 1.9.1 です。(UTF-8 を使用)
yaml2json.rb。簡単なスクリプトです。
#!/usr/bin/env ruby1.9.1 # -*- coding: utf-8 -*- require 'yaml' require 'json' s = ARGF.read data = YAML.load(s) puts JSON.dump(data) # vi:set ts=2 sw=2 et fenc=utf-8:
ちょっとテストです。入力 YAML ファイル sample-list.yaml。リストデータです。
- red - green - 青
実行。
$ ruby1.9.1 yaml2json.rb sample-list.yaml ["red","green","青"]
OK です。
テストもそこそこに、~/bin/ にインストール。
$ install -m 755 yaml2json.rb ~/bin/
Makefile を作成。([修正] 2011/07/09: カレントディレクトリの 全部の YAML ファイルを JSON に変換するデフォルトターゲット(all) を追加)
YAML2JSON := ${HOME}/bin/yaml2json.rb %.json: %.yaml ${YAML2JSON} $< >$@ YAML_SRCS := $(wildcard *.yaml) JSON_SRCS := $(subst .yaml,.json,${YAML_SRCS}) all : ${JSON_SRCS}
$ make sample-list.json
$ cat sample-list.json ["red","green","青"]
OK です。
もうちょっと他のテストです。入力ファイルと変換結果のみ記載してます。
YAML について注意。インデントは「空白文字」で行ないます。タブは使えません。
1. ハッシュ
r: red g: green b: 青
結果
{"r":"red","g":"green","b":"青"}
2. ハッシュのハッシュ
basic: red: rgb(255, 0, 0) green: rgb(0, 255, 0) 青: rgb(0, 0, 255) ユーザ定義: user 01: rgb(128, 0, 0) user 02: rgb(255, 128, 128)
結果
{"basic":{"red":"rgb(255, 0, 0)","green":"rgb(0, 255, 0)","青":"rgb(0, 0, 255)"},"ユーザ定義":{"user 01":"rgb(128, 0, 0)","user 02":"rgb(255, 128, 128)"}}
3. リストのハッシュ
basic: - rgb(255, 0, 0) - rgb(0, 255, 0) - rgb(0, 0, 255) ユーザ定義: - rgb(128, 0, 0) - rgb(255, 128, 128)
結果
{"basic":["rgb(255, 0, 0)","rgb(0, 255, 0)","rgb(0, 0, 255)"],"ユーザ定義":["rgb(128, 0, 0)","rgb(255, 128, 128)"]}
4. ハッシュのリスト
- red: rgb(255, 0, 0) green: rgb(0, 255, 0) 青: rgb(0, 0, 255) - user 01: rgb(128, 0, 0) user 02: rgb(255, 128, 128)
結果
[{"red":"rgb(255, 0, 0)","green":"rgb(0, 255, 0)","青":"rgb(0, 0, 255)"},{"user 01":"rgb(128, 0, 0)","user 02":"rgb(255, 128, 128)"}]
5. リストのリスト
- - '#ff0000' - '#00ff00' - '#0000ff' - - red - green - 青
結果
[["#ff0000","#00ff00","#0000ff"],["red","green","青"]]
余談。
JSON を読んで YAML に変換するスクリプトも書いてみました。...が、ちょっと問題ありです。
#!/usr/bin/env ruby1.9.1 # -*- coding: utf-8 -*- require 'yaml' require 'json' s = ARGF.read data = JSON.load(s) puts YAML.dump(data) # vi:set ts=2 sw=2 et fenc=utf-8:
YAML.dump が漢字コードを出力するときにエスケープしてしまいます。
ぐぐると、YAML.unescape (ruby1.9.2 では Syck.unescape) を使ってエスケープを抑止する、など書いてあるブログなど見つけたのですが、YAML.unescape というメソッドが見つからず、よくわからなかったので断念。
Ubuntu の ruby が 1.9.2 になったら考えます。それまで JSON to YAML 変換は先送り。