読者です 読者をやめる 読者になる 読者になる

Rails Webook

自社のECを開発している会社で働いています。Rails情報やサービスを成長させる方法を書いていきます

Rails4でJSON, XML, YAMLの読み込みと出力

Rails ActiveSupport Rails初級

Railsでは、ActiveSupportにより、Array, Hash, ActiveModel(ActiveRecord)とJSON, XML, YAMLのフォーマットを変換するメソッドが拡張されています。

動作確認

  • Rails 4.1
  • ActiveSupport 4.1.7

目次

  1. JSONの読み込み(ActiveSupport::JSON.decode)
  2. JSONの出力(to_json)
  3. XMLの読み込み(from_xml)
  4. XMLの出力(to_xml)
  5. YAMLの読み込み(YAML.load)
  6. YAMLの出力(to_yaml)


JSONの読み込み(ActiveSupport::JSON.decode)

ActiveSupport::JSON.decodeメソッドを使うことで、JSON形式の文字列を解析し、Hashに変換します。

ActiveSupport::JSON.decode("{\"id\":2,\"name\":\"田中\",\"created_at\":\"2014-11-29T03:02:30.449-06:00\",\"updated_at\":\"2014-11-29T03:02:30.449-06:00\"}")
# => {"id"=>2, "name"=>"田中", "created_at"=>"2014-11-29T03:02:30.449-06:00", "updated_at"=>"2014-11-29T03:02:30.449-06:00"}


# パースの例外処理
begin
  obj = ActiveSupport::JSON.decode(json_string)
rescue ActiveSupport::JSON.parse_error
  Rails.logger.warn("妥当でないJSON文字列です: #{json_string}")
end


JSONの出力(to_json)

RailsではObject#to_jsonメソッドが定義されているので、Array, Hash, ActiveRecordなどからJSON形式の出力をすることが可能です。

# 配列からJSONへ
[1, 2, 3].to_json
# => "[1,2,3]"

# ハッシュからJSONへ
{ "hash" => { "foo" => 1, "bar" => 2 } }.to_json
# => "{\"hash\":{\"foo\":1,\"bar\":2}}"

# ActiveRecordからJSONへ
User.last.to_json
# => "{\"id\":2,\"name\":\"田中\",\"created_at\":\"2014-11-29T03:02:30.449-06:00\",\"updated_at\":\"2014-11-29T03:02:30.449-06:00\"}"


XMLの読み込み(from_xml)

Hash.from_xmlを使うことで、XMLをハッシュに変換することができます。

xml = <<-XML
  <?xml version="1.0" encoding="UTF-8"?>
    <hash>
      <foo type="integer">1</foo>
      <bar type="integer">2</bar>
    </hash>
XML

hash = Hash.from_xml(xml)
# => {"hash"=>{"foo"=>1, "bar"=>2}}


XMLの出力(to_xml)

Array, Hash, ActiveModel(ActiveRecord)にはto_xmlというXMLに変換して出力するメソッドがあります。

# 配列からXMLへ
[1, 2, 3].to_xml
# => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<fixnums type=\"array\">\n  <fixnum type=\"integer\">1</fixnum>\n  <fixnum type=\"integer\">2</fixnum>\n  <fixnum type=\"integer\">3</fixnum>\n</fixnums>\n"

# ハッシュからXMLへ
{ "hash" => { "foo" => 1, "bar" => 2 } }.to_xml
# => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<hash>\n  <hash>\n    <foo type=\"integer\">1</foo>\n    <bar type=\"integer\">2</bar>\n  </hash>\n</hash>\n"

# ActiveRecordからXMLへ
User.last.to_xml
# => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>\n  <id type=\"integer\">2</id>\n  <name>田中</name>\n  <created-at type=\"dateTime\">2014-11-29T03:02:30-06:00</created-at>\n  <updated-at type=\"dateTime\">2014-11-29T03:02:30-06:00</updated-at>\n</user>\n"


YAMLの読み込み(YAML.load)

RailsではYAML.loadにより、YAmLファイルを読み込むことが可能です。

yaml = <<TEXT
---
:id: 3
:username: \"太郎\"
:age: 30
TEXT

YAML.load(yaml)
# => {:id=>3, :username=>"太郎", :age=>30}

# もちろん、ファイルからも読み込める
YAML.load(File.open("test.yml"))


YAMLの出力(to_yaml)

RailsではObject#to_yamlメソッドが定義されているので、Array, Hash, ActiveRecordなどからYAML形式の出力をすることが可能です。

# ArrayをYAMLへ
["abc", "def", "zxy"].to_yaml
# => "---\n- abc\n- def\n- zxy\n"

# HashをYAMLへ
{ id: 3, username: "太郎", age: 30 }.to_yaml
# => "---\n:id: 3\n:username: \"太郎\"\n:age: 30\n"

# ActiveRecordをYAMLへ
User.last.to_yaml
# => "--- !ruby/object:User\nattributes:\n  id: 2\n  name: \"田中\"\n  created_at: 2014-11-29 09:02:30.449449000 Z\n  updated_at: 2014-11-29 09:02:30.449449000 Z\n"


以上です。

参考文献