module ObjectableJSON

Constants

VERSION

Public Class Methods

parse(json_or_hash, name_space = 'ObjectedJSON') click to toggle source

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(klass_name, attributes) click to toggle source

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(klass_name, raw_attrs) click to toggle source

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_attributes(raw_attrs) click to toggle source

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_to_hash(json_or_hash) click to toggle source

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
klassable?(attr_val) click to toggle source

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
need_klass_name?(attr_val) click to toggle source

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