- 更新日: 2014年5月22日
- Ruby
Ruby の YAML.load で yaml 形式の文字列 → オブジェクト変換時のエラー
Ruby で YAML.load を使って yaml 形式の文字列から Ruby オブジェクトに変換しようとして、いくつかエラーが出て少しはまったので備忘録です。
ハッシュのリストの yaml
次のようなハッシュのリストの YAML データ操作時のことです。以下は valid な yaml なので、正常に YAML.load できます。
1 2 3 4 5 |
name: - first: first name 1 last: last name 1 - first: first name 2 last: last name 2 |
実際には YAML データを Ruby の文字列の変数としての処理で、以下のような YAML 形式の文字列データを処理していました。ダブルクォートの中で \n とスペースで yaml データを表現しようとするので見辛いです。はまる原因になりやすい。
1 |
"name:\n- first: first name 1\n last: last name 1\n- first: first name 2\n last: last name 2\n" |
これは正常な yaml の形式になっているので、YAML.load で正常に Ruby のオブジェクトに変換できます。
1 2 3 4 5 6 |
pry(main)> YAML.load "name:\n- first: first name 1\n last: last name 1\n- first: first name 2\n last: last name 2\n" => {"name"=> [{"first"=>"first name 1", "last"=>"last name 1"}, {"first"=>"first name 2", "last"=>"last name 2"}]} |
ハッシュの配列に変換できた。
Psych::SyntaxError: (): did not find expected key
はまった事例1です。次の文字列のケース。
1 |
"name:\n- first: first name 1\n last: last name 1\n- first: first name 2\n last: last name 2\n" |
この文字列は、YAML.load させると以下のようにエラー。
1 2 3 4 |
pry(main)> YAML.load "name:\n- first: first name 1\n last: last name 1\n- first: first name 2\n last: last name 2\n" Psych::SyntaxError: (<unknown>): did not find expected key while parsing a block mapping at line 1 column 1 |
実はこの文字列は yaml データとしては invalid な形式になっていまして、以下のように3行目のスペースが1つ足りないのが原因です。
1 2 3 4 5 |
name: - first: first name 1 last: last name 1 - first: first name 2 last: last name 2 |
Psych::SyntaxError: (): could not find expected ‘:’
次はこのデータ。
1 |
"name:\n- first: first name 1\n last:last name 1\n- first: first name 2\n last: last name 2\n" |
今度は、以下のように could not find expected ‘:’ のエラーが出ました。
1 2 3 4 |
pry(main)> YAML.load "name:\n- first: first name 1\n last:last name 1\n- first: first name 2\n last: last name 2\n" Psych::SyntaxError: (<unknown>): could not find expected ':' while scanning a simple key at line 3 column 3 |
このパターンでは、以下のように3行目のコロンの後にスペースが開いていないのが原因です。
1 2 3 4 5 |
name: - first: first name 1 last:last name 1 - first: first name 2 last: last name 2 |
Psych::SyntaxError: (): mapping values are not allowed in this context
最後に次のパターンの文字列。
1 |
"name:\n- first: first name 1\n last: last name 1\n- first:first name 2\n last: last name 2\n" |
今度は、 mapping values are not allowed のエラー。
1 2 3 4 |
pry(main)> YAML.load "name:\n- first: first name 1\n last: last name 1\n- first:first name 2\n last: last name 2\n" Psych::SyntaxError: (<unknown>): mapping values are not allowed in this context at line 5 column 7 |
実は、4行目 first の後ろのコロンの後にスペースが開いていないのが原因です。
1 2 3 4 5 |
name: - first: first name 1 last: last name 1 - first:first name 2 last: last name 2 |
ということで、YAML.load での操作時に上記のようなエラーに遭遇しました。文字列で YAML データを操作する際は、特に注意したい。
- Ruby の関連記事
- Gemの作り方(Ruby Gem)
- ローカル開発中のgemをGemfileに書いてインストール
- 熊本地震の余震が夜に多いのは本当か?Rubyプログラムで検証してみた
- El Capitanでgemのnative extensionビルド失敗に対応
- Rubyで親クラスから子クラスの定数を参照
- MacabをRubyで使う
- rbenv/ruby-buildでRuby最新バージョンをインストール
- Rubyでクラスインスタンス変数にインスタンスメソッドからアクセス
- 距離1kmあたりの緯度・経度の度数を計算(日本・北緯35度)
- Google Maps Geocoding APIで住所から緯度・経度を取得するRubyコード
Leave Your Message!