Rubyでのハッシュからjson文字列に変換する方法

個人的にこんがらがったので、メモ。
Rubyでは、調べた限りだとハッシュからjsonへの変換する方法が3コ見つかりました。
どちらも標準のjsonモジュールをインポートします。

1
require 'json'

この記事では、それら三つの変換方法の違いを述べていきます。
また、記述に間違いなどありましたら申し訳ありません。

(1) generateメソッドを使う場合
generateメソッドの第一引数にオブジェクトまたは配列を渡すことで、jsonに変換します。
:例

1
2
3
hoge = {'age'=>18, 'tall'=>150}
JSON.generate(hoge)
=> "{\"age\":18,\"tall\":150}"

ここでのポイントは
第一引数にオブジェクトまたは配列を渡すこと
がgenerateメソッドの条件です。つまり、オブジェクト又は配列以外を渡すと変換に失敗します。

1
2
3
4
5
6
str = "abcde"
JSON.generate(str)
=>JSON::GeneratorError: only generation of JSON objects or arrays allowed
num = 1000
JSON.generate(num)
=>JSON::GeneratorError: only generation of JSON objects or arrays allowed

(2) to_jsonメソッドを使う場合
generateメソッドと比較して、to_jsonメソッドはあらゆるクラスに対して寛容です。

1
2
3
4
5
6
7
8
9
hoge = {'age'=>18, 'tall'=>150}
hoge.to_json
=> "{\"age\":18,\"tall\":150}"
str = "abcde"
str.to_json
=> "\"abcde\""
num = 1000
num.to_json
=> "1000"

これがgenerateメソッドとの大きな違いになります。

(3) dumpメソッドを使う場合
(このメソッドの解説は正確さに欠けるかもしれません)
dumpメソッドはこれまでの例で示してきたすべての文字列や配列をjsonに変換してくれます。
ただ、dumpメソッドはマーシャルやヤムル(いずれもデータフォーマット)のload/dump実行の一部です。
ゆえに、上のメソッドと違い、ファイルに変換したjson文字列を書き込むことができます。

(4) まとめ
とりあえずjson文字列に変換したい場合、どのメソッドを使ってもよさそう。ファイルに書き込みとかするなら、dumpメソッドがよさそう。