RubyハッシュオブジェクトをJSONに変換する方法


340

RubyハッシュオブジェクトをJSONに変換する方法 だから私は以下のこの例を試していますが、うまくいきませんか?

RubyDocを見ていましたが、明らかにHashオブジェクトにはto_jsonメソッドがありません。しかし、私はRailsがサポートしactive_record.to_json、またサポートしているブログを読んでいますhash#to_jsonActiveRecordRailsオブジェクトであることは理解できますが、RailsのHashネイティブではなく、純粋なRubyオブジェクトです。したがって、Railsではを実行できますがhash.to_json、純粋なRubyではできません??

car = {:make => "bmw", :year => "2003"}
car.to_json

回答:


563

Rubyの非常に優れた点の1つは、既存のクラスを独自のメソッドで拡張できることです。これは「クラスの再開」またはモンキーパッチングと呼ばれます(ただし、後者の意味はさまざまです)。

だから、ここを見てください:

car = {:make => "bmw", :year => "2003"}
# => {:make=>"bmw", :year=>"2003"}
car.to_json
# NoMethodError: undefined method `to_json' for {:make=>"bmw", :year=>"2003"}:Hash
#   from (irb):11
#   from /usr/bin/irb:12:in `<main>'
require 'json'
# => true
car.to_json
# => "{"make":"bmw","year":"2003"}"

ご覧のとおり、requireing jsonは魔法のようにメソッドto_jsonをにもたらしましたHash


2
私が言えることはすごいです:)また、ありがとうございました!! 基本的に私は動的にjsonクラスを拡張することができましたか?
kapso

1
Rubyオブジェクトで同じことを試しましたが、動作しませんか?>> require 'json' => true >>クラスPerson >> attr_accessor:fname、:lname >> end => nil >> p = Person.new =>#<Person:0x101155f70> >> p.fname = "Bill "=>" Bill ">> p.lname =" Shine "=>" Shine ">> p.to_json =>" \ "#<Person:0x101155f70> \" "
kapso

10
いいえ、いいえ、誰かが任意のクラスのオブジェクトをJSONにシリアル化する方法をコーディングする必要があります。彼らはそれをジェムのクラスのためにHash行いArrayましたjsonが、あなたのクラスPersonは単なるプレーンObjectです。しかし、Hash代わりに継承することができます。管理していない場合は、新しい質問を開くことができます。
MladenJablanović2010

ありがとう。ここに新しい質問があります、どんな助けもいただければ幸いです。ありがとう。 stackoverflow.com/questions/3226054/...
kapso

IRBタイプの出力に見えるものを表示しています。私はhash#to_jsonがDateTimeオブジェクトで機能するようにしようとしていました。この投稿のおかげで私はそれを手に入れました。しかし、p date_jsonで検査しました。これは、真の文字列 "{\" year \ ":2013、\" mon \ ":7、\" mday \ ":16、\" hour \ ":13に対して取得したものです。 \ "min \":54、\ "sec \":32、\ "zone \":\ "-05:00 \"、\ "offset \":-18000} "なので、文字列としてのキーシンボル、そしてもちろんそのデータは変更されません。再度、感謝します。申し訳ありませんが、私はとても遅れています。
ダグラスG.アレン

19
require 'json/ext' # to use the C based extension instead of json/pure

puts {hash: 123}.to_json

6

あなたも使うことができますJSON.generate

require 'json'

JSON.generate({ foo: "bar" })
=> "{\"foo\":\"bar\"}"

またはそのエイリアス、JSON.unparse

require 'json'

JSON.unparse({ foo: "bar" })
=> "{\"foo\":\"bar\"}"

3

ファイルの先頭に次の行を追加します

require 'json'

それからあなたは使うことができます:

car = {:make => "bmw", :year => "2003"}
car.to_json

または、以下を使用することもできます。

JSON.generate({:make => "bmw", :year => "2003"})

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.