Rubyのオブジェクト(Hashとか)をyamlフォーマットと相互変換するサンプル。

yamlファイルをIO::readなどで読み込んで文字列化したものを、YAML::loadに渡すとRubyオブジェクト化できる。
YAML::StoreでRubyのオブジェクトをyamlファイルとして保存できる。

以下、サンプルコード。


$ cat ./yamltest.rb
require 'yaml'
require 'yaml/store'
require 'pp'
 
class Hoge
  attr_accessor :ha, :hb, :hc
end
 
obj = {
  'a' => 'aaa',
  :b  => 'bbb',
  'c' => [0, 1, 2],
  'd' => {
    'e' => 2.71828183,
    :f  => [true, false],
    'g' => Time.now,
    'h' => nil,
  }
}
 
hoge = Hoge.new
hoge.ha = 'hahaha'
hoge.hb = { 'hb1' => 'heavy battle', 'hb2' => 'hard bbb!' }
hoge.hc = obj 
 
# yamlファイルを出力
yamldb = YAML::Store.new('yaml.yml')
yamldb.transaction{|db|
  db['obj'] = obj
  db['hoge'] = hoge
}
 
# 生成されたyamlファイルの中身を出力
yamlstr = IO::read('yaml.yml')
puts '------------------------------'
puts yamlstr
 
# yamlファイルを読み込んでRubyオブジェクト化
yamlobj = YAML::load(yamlstr)
puts '------------------------------'
pp yamlobj
実行結果。

$ ruby ./yamltest.rb
------------------------------
---
obj: &id001 
  a: aaa
  c: 
  - 0
  - 1
  - 2
  d: 
    :f: 
    - true
    - false
    e: 2.71828183
    g: 2011-04-01 16:55:47.299242 +09:00
    h: 
  :b: bbb
hoge: !ruby/object:Hoge 
  ha: hahaha
  hb: 
    hb1: heavy battle
    hb2: hard bbb!
  hc: *id001
------------------------------
{"obj"=>
  {"a"=>"aaa",
   "c"=>[0, 1, 2],
   "d"=>
    {:f=>[true, false],
     "e"=>2.71828183,
     "g"=>Fri Apr 01 16:55:47 +0900 2011,
     "h"=>nil},
   :b=>"bbb"},
 "hoge"=>
  #<Hoge:0x1003d7330
   @ha="hahaha",
   @hb={"hb1"=>"heavy battle", "hb2"=>"hard bbb!"},
   @hc=
    {"a"=>"aaa",
     "c"=>[0, 1, 2],
     "d"=>
      {:f=>[true, false],
       "e"=>2.71828183,
       "g"=>Fri Apr 01 16:55:47 +0900 2011,
       "h"=>nil},
     :b=>"bbb"}>}

tags: ruby yaml

Posted by NI-Lab. (@nilab)