私はこのようなことをしたいと思います:
require 'json'
class Person
attr_accessor :fname, :lname
end
p = Person.new
p.fname = "Mike"
p.lname = "Smith"
p.to_json
出来ますか?
はい、 to_json
で実行できます。
Railsを実行していない場合は、require 'json'
が必要になることがあります。
それを試してみてください。 Ruby on Rails(およびタグがあなたにそう言っている)を使用している場合、この正確なコードは何も必要とせずにすでに機能しているはずです。
RailsはコントローラーからのJSON出力をサポートしているため、必要になるJSONシリアライゼーションコードのすべてがすでに組み込まれています。コントローラを介してこのデータを出力する場合は、次のように書くだけで時間を節約できる可能性があります
render :json => @person
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メソッドの使用 」も参照してください。