RubyでJSONとYAMLを自在に操作する:データフォーマットの完全攻略

RubyでJSONとYAMLを自在に操作する:データフォーマットの完全攻略

JSONとYAMLは、構造化データを扱う際に頻繁に使用されるフォーマットです。Rubyでは、これらのフォーマットを簡単に操作するための標準ライブラリやツールが充実しています。本記事では、JSONとYAMLをRubyで効率よく操作する方法を網羅します。

JSONとYAMLの基本

JSONはJavaScript Object Notationの略で、軽量なデータ交換フォーマットです。一方、YAMLはYet Another Markup Languageの略で、人間に優しいデータフォーマットとして設計されています。

JSONモジュールを使用する

Rubyには標準でJSONモジュールが含まれており、簡単にJSONの操作が可能です。

require 'json'

# ハッシュをJSON文字列に変換
hash = { name: "Alice", age: 30, skills: ["Ruby", "JavaScript"] }
json_string = JSON.generate(hash)
puts json_string
# => {"name":"Alice","age":30,"skills":["Ruby","JavaScript"]}

# JSON文字列をハッシュに変換
parsed_hash = JSON.parse(json_string)
puts parsed_hash["name"] # => Alice

YAMLモジュールを使用する

YAMLも標準ライブラリでサポートされています。

require 'yaml'

# ハッシュをYAML文字列に変換
hash = { name: "Bob", age: 25, hobbies: ["Hiking", "Reading"] }
yaml_string = hash.to_yaml
puts yaml_string
# => ---
#    :name: Bob
#    :age: 25
#    :hobbies:
#    - Hiking
#    - Reading

# YAML文字列をハッシュに変換
parsed_hash = YAML.safe_load(yaml_string)
puts parsed_hash[:name] # => Bob

ファイル操作とJSON

JSONデータをファイルに書き込んだり、ファイルから読み取ったりできます。

require 'json'

# 書き込み
File.open("data.json", "w") do |file|
  file.write(JSON.generate({ key: "value", number: 123 }))
end

# 読み込み
data = File.read("data.json")
parsed_data = JSON.parse(data)
puts parsed_data["key"] # => value

ファイル操作とYAML

YAMLファイルの入出力も簡単に行えます。

require 'yaml'

# 書き込み
File.open("data.yaml", "w") do |file|
  file.write({ language: "Ruby", version: "3.2" }.to_yaml)
end

# 読み込み
data = File.read("data.yaml")
parsed_data = YAML.safe_load(data)
puts parsed_data["language"] # => Ruby

シンボルキーとJSON

JSONモジュールでは、キーが文字列になるため、シンボルキーを保持したい場合には注意が必要です。

require 'json'

json_string = '{"name":"Charlie","active":true}'
parsed_hash = JSON.parse(json_string, symbolize_names: true)
puts parsed_hash[:name] # => Charlie

安全なYAMLの読み取り

YAMLは任意のオブジェクトをロードできるため、安全性に配慮する必要があります。

require 'yaml'

yaml_string = "---\nfoo: bar\n"
safe_hash = YAML.safe_load(yaml_string)
puts safe_hash["foo"] # => bar

JSONとYAMLの相互変換

JSONとYAMLは相互に変換可能です。

require 'json'
require 'yaml'

json_string = '{"name":"Daisy","age":28}'
yaml_string = YAML.dump(JSON.parse(json_string))
puts yaml_string
# => ---
#    name: Daisy
#    age: 28

複雑な構造を扱う

JSONやYAMLではネストしたデータ構造も簡単に扱えます。

require 'json'
require 'yaml'

data = {
  user: {
    name: "Eve",
    preferences: {
      theme: "dark",
      notifications: true
    }
  }
}

# JSON変換
json = JSON.generate(data)
puts json
# => {"user":{"name":"Eve","preferences":{"theme":"dark","notifications":true}}}

# YAML変換
yaml = data.to_yaml
puts yaml
# => ---
#    :user:
#      :name: Eve
#      :preferences:
#        :theme: dark
#        :notifications: true

パフォーマンスの最適化

大量のデータを処理する場合、ストリームベースのパーサを検討します。

require 'json'

File.open("large.json", "r") do |file|
  file.each_line do |line|
    parsed_line = JSON.parse(line)
    # 各行を処理
  end
end

ライブラリの拡張

特定のフォーマットでJSONやYAMLを処理したい場合、独自のモジュールを作成することが可能です。

module CustomJSON
  require 'json'

  def self.to_pretty_json(hash)
    JSON.pretty_generate(hash)
  end
end

data = { key: "value", array: [1, 2, 3] }
puts CustomJSON.to_pretty_json(data)
# => {
#      "key": "value",
#      "array": [
#        1,
#        2,
#        3
#      ]
#    }

まとめ

Rubyでは、JSONとYAMLを簡単に操作できるツールが用意されています。それぞれの特徴を理解し、適切に使い分けることで、効率的なデータ処理が可能になります。