huynhthinh
huynhthinh

Reputation: 37

Convert JSON to new structure

I have a json object i need to convert it to new structure

source json

{
   "application.name" : "testing",
    "application.button.close" : "close",
    "application.button.delete" : "delete",
    "module.content" : "admin"
}

expected json

{
    "application": {
        "name" : "testing",
        "button": {
            "close": "close", 
            "delete": "delete"
        }
    },       
    "module": {
        "content" : "admin"
    }
}

I will split each of key that contain '.' sign and move it into new object. I have tried but not work as expectation. Details my code are as below

def convert
    result = {}
    key_list = {
        "application.name" => "testing",
        "application.button.close" => "close",
        "application.button.delete" => "delete",
        "module.content" => "admin"
    }

    key_list.each { |k, v|
      levels = k.split('.')
      add_to_hash(result, k, v, levels)
    }    
  end

  def add_to_hash(result, key, value, levels)
      current_level = levels.first
      if(levels.count == 1)
        {key => value}
      else
        levels.shift
        unless(result.has_key?(current_level))
          result[current_level] = {}
        end
        result[current_level].merge!(      add_to_hash(result[current_level], levels.join('.'), value,levels) )
        result
      end
  end

I am using ruby. thanks all!

Upvotes: 0

Views: 80

Answers (1)

ROR
ROR

Reputation: 441

Please try like this code.

class Converted

  def self.convert
    result = {}
    key_list = {
    "application.name" => "testing",
    "application.button.close" => "close",
    "application.button.delete" => "delete",
    "module.content" => "admin"
    }

    key_list.each { |k, v|
      levels = k.split('.')
      add_to_hash(result, k, v, levels)
    }
    result
  end    

  def self.add_to_hash(result, key, value, levels)
    current_level = levels.first
    if(levels.count == 1)
      {key => value}
    else
      levels.shift
      unless(result.has_key?(current_level))
      result[current_level] = {}
    end
    result[current_level].merge!(add_to_hash(result[current_level], levels.join('.'), value,levels) )
  result
  end
 end

end    

Converted.convert

Upvotes: 1

Related Questions