web-dev-qa-db-ja.com

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

私はこのようなことをしたいと思います:

require 'json'

class Person
attr_accessor :fname, :lname
end

p = Person.new
p.fname = "Mike"
p.lname = "Smith"

p.to_json

出来ますか?

31
kapso

はい、 to_json で実行できます。

Railsを実行していない場合は、require 'json'が必要になることがあります。

22
Salil

それを試してみてください。 Ruby on Rails(およびタグがあなたにそう言っている)を使用している場合、この正確なコードは何も必要とせずにすでに機能しているはずです。

RailsはコントローラーからのJSON出力をサポートしているため、必要になるJSONシリアライゼーションコードのすべてがすでに組み込まれています。コントローラを介してこのデータを出力する場合は、次のように書くだけで時間を節約できる可能性があります

render :json => @person
20
Matchu

Railsに触れずにRubyクラスをJSON対応にするために、2つのメソッドを定義します。

  • to_json、JSONオブジェクトを返します
  • as_json、オブジェクトのハッシュ表現を返します

オブジェクトが両方に適切に応答する場合to_jsonおよびas_json、配列やハッシュなどの他の標準クラスの内部に深くネストされている場合でも、正しく動作する可能性があります。

#!/usr/bin/env Ruby

require 'json'

class Person

    attr_accessor :fname, :lname

    def as_json(options={})
        {
            fname: @fname,
            lname: @lname
        }
    end

    def to_json(*options)
        as_json(*options).to_json(*options)
    end

end

p = Person.new
p.fname = "Mike"
p.lname = "Smith"

# case 1
puts p.to_json                  # output: {"fname":"Mike","lname":"Smith"}

# case 2
puts [p].to_json                # output: [{"fname":"Mike","lname":"Smith"}]

# case 3
h = {:some_key => p}
puts h.to_json                  # output: {"some_key":{"fname":"Mike","lname":"Smith"}}

puts JSON.pretty_generate(h)    # output
                                # {
                                #   "some_key": {
                                #     "fname": "Mike",
                                #     "lname": "Smith"
                                #   }
                                # }

ネストされたオブジェクトでのカスタムto_jsonメソッドの使用 」も参照してください。

16