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を簡単に操作できるツールが用意されています。それぞれの特徴を理解し、適切に使い分けることで、効率的なデータ処理が可能になります。
-
前の記事
Rubyのオブジェクトスペース:ObjectSpaceを使った高度なデバッグ 2024.12.18
-
次の記事
Rubyのオープンクラス vs Refinements:コード拡張の新旧アプローチ 2024.12.18
コメントを書く