将JSON转换为新结构

时间:2015-03-26 09:43:41

标签: ruby-on-rails ruby json

我有一个json对象,我需要将其转换为新结构

来源json

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

预期json

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

我将拆分包含'。'的每个键。签名并将其移动到新对象中。 我试过但没有按预期工作。我的代码详情如下

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

我正在使用红宝石。谢谢大家!

1 个答案:

答案 0 :(得分:1)

请尝试使用此代码。

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