module ObjectableJSON
Constants
- VERSION
Public Class Methods
parse JSON/Hash to ObjectedJSON @param json_or_hash json_or_hash object @param name_space top name space @return [ObjectedJSON] ObjectedJSON object(class name is set as top_name_space arg dynamically)
# File lib/objectable_json.rb, line 11 def parse(json_or_hash, name_space = 'ObjectedJSON') KlassCreator.name_space = name_space hash = convert_to_hash(json_or_hash) build(name_space, hash) end
Private Class Methods
add klass name to hash if hash has hash array like this @example
{ "friends" => [ { "name" => "yamada", "sex" => "male" }, { "name" => "sato", "sex" => "female" }, { "name" => "john", "sex" => "male", "country" => "us" } ] }
this hash array need class name, so 'friend' key complemented hash like this (class name is singularized only singularize method available) @example
{ "friends" => [ "friend" => { "name" => "yamada", "sex" => "male" }, "friend" => { "name" => "sato", "sex" => "female" }, "friend" => { "name" => "john", "sex" => "male", "country" => "us" } ] }
# File lib/objectable_json.rb, line 111 def add_klass_name(klass_name, attributes) { klass_name.singularize => attributes } end
build objected json object @param klass_name [String] klass_name @param raw_attrs [Hash] klass attribute_names @return [ObjectedJSON(top_klass_name)] objected json
# File lib/objectable_json.rb, line 22 def build(klass_name, raw_attrs) attributes = build_attributes(raw_attrs) klass = KlassCreator.create_klass(klass_name, raw_attrs.keys) klass.new(attributes) end
build class attributes. if raw_attrs values includes hash, the hash convert to object recursively. @param raw_attrs [Hash] raw attributes hash @return [Hash] objected attributes hash
# File lib/objectable_json.rb, line 32 def build_attributes(raw_attrs) attributes = {} raw_attrs.each do |attr_key, attr_val| attributes[attr_key] = if klassable?({ attr_key => attr_val }) build(attr_key, attr_val) elsif attr_val.instance_of?(Array) attr_val.map do |v| value = need_klass_name?(v) ? add_klass_name(attr_key.singularize, v) : v klassable?(value) ? build(value.keys.first, value.values.first) : value end else attr_val end end attributes end
convert json to hash if needed @param json_or_hash @return [Hash]
# File lib/objectable_json.rb, line 118 def convert_to_hash(json_or_hash) json_or_hash.instance_of?(Hash) ? json_or_hash : JSON.parse(json_or_hash) end
check value is can be convert to class or not it return true attr_val has class name(hash key) & values(hash val) like this @example
{ "user" => { "email" => "hoge@baz.com", "sex"=>=> "male" } }
# File lib/objectable_json.rb, line 59 def klassable?(attr_val) attr_val.instance_of?(Hash) && attr_val.values.first.instance_of?(Hash) end
judge need to add klass name to hash @see ObjectableJSON::Builder.add_klass_name @param attr_val @return [Boolean] need to add klass name or not
# File lib/objectable_json.rb, line 67 def need_klass_name?(attr_val) !klassable?(attr_val) && attr_val.instance_of?(Hash) end