何の記事?
RubyでObjectとJSONを相互変換する関数を書いてみました。
成果物
json_obj_mapper.rb
# json文字列から指定したクラスのインスタンスを生成
def to_o(json, klass)
a = klass.new
JSON.parse(json).each do |k,v|
if(a.respond_to?("set_"+k.to_s))
a.send("set_"+k.to_s, v)
end
end
a
end
# オブジェクトからJSON文字列を生成
def to_j(obj)
hash = {}
obj.class.instance_methods(false).grep(/get_.*/).each do |e|
method_name = e.to_s
key_name = method_name[4..-1]
hash[key_name] = obj.send(method_name)
end
hash.to_json
end
使い方
irb(main):001:0> load './json_obj_mapper.rb'
=> true
irb(main):002:0> class A
irb(main):003:1> def initialize
irb(main):004:2> @x = 0
irb(main):005:2> @y = ""
irb(main):006:2> end
irb(main):007:1> def set_x(x)
irb(main):008:2> @x = x
irb(main):009:2> end
irb(main):010:1> def set_y(y)
irb(main):011:2> @y = y
irb(main):012:2> end
irb(main):013:1> def get_x
irb(main):014:2> @x
irb(main):015:2> end
irb(main):016:1> def get_y
irb(main):017:2> @y
irb(main):018:2> end
irb(main):019:1> end
=> :get_y
irb(main):020:0> to_o({"x"=>123, "y"=>"abc"}.to_json, A)
=> #<A:0x0000000322e298 @x=123, @y="abc">
irb(main):021:0> a = A.new
=> #<A:0x00000003226a48 @x=0, @y="">
irb(main):022:0> a.set_x(123)
=> 123
irb(main):023:0> a.set_y("abc")
=> "abc"
irb(main):024:0> to_j(a)
=> "{\"x\":123,\"y\":\"abc\"}"
irb(main):025:0> puts to_j(a)
{"x":123,"y":"abc"}
=> nil
irb(main):026:0>
to_o
: 第2引数で指定されたクラスのインスタンスを作ります。
set_[JSONのキー文字列]
というメソッドを通して属性値をセットします。to_j
: オブジェクトからJSON文字列を作ります。
get_*
というメソッドからJSONのキーとオブジェクトの属性値を取得します。