Hatena::Grouprubyist

Going My Ruby Way このページをアンテナに追加 RSSフィード

Ruby ロゴ (C) Ruby Association LLC

2011年07月07日(木)

YAML を読んで JSON に変換する

| 22:17 |  YAML を読んで JSON に変換する - Going My Ruby Way を含むブックマーク はてなブックマーク -  YAML を読んで JSON に変換する - Going My Ruby Way  YAML を読んで JSON に変換する - Going My Ruby Way のブックマークコメント

JSONJavaScript の構文なので、自分的には、引用符とか括弧などがちょっと見づらいし書くのが面倒です。

なので、データは 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}

sample-list.json を make してみる。

$ make sample-list.json

作成された sample-list.json の内容確認。

$ cat sample-list.json 
["red","green","青"]

OK です。

---

もうちょっと他のテストです。入力ファイルと変換結果のみ記載してます。

YAML について注意。インデントは「空白文字」で行ないます。タブは使えません。

1. ハッシュ

入力 sample-hash.yaml

r: red
g: green
b:

結果

{"r":"red","g":"green","b":"青"}

2. ハッシュのハッシュ

入力 sample-HoH.yaml

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. リストのハッシュ

入力 sample-HoL.yaml

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. ハッシュのリスト

入力 sample-LoH.yaml

-
  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. リストのリスト

入力 sample-LoL.yaml

-
  - '#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 というメソッドが見つからず、よくわからなかったので断念。

Ubunturuby が 1.9.2 になったら考えます。それまで JSON to YAML 変換は先送り。