1
2

More than 5 years have passed since last update.

Object <=> JSON 相互変換 on Ruby

Last updated at Posted at 2016-07-09

何の記事?

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のキーとオブジェクトの属性値を取得します。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2