读取嵌套哈希并生成类似结构

时间:2016-04-28 18:26:42

标签: ruby recursion hash

我正在尝试读取JSON模式,解析特定内容,并生成具有相同嵌套结构的新Hash。

我能够遍历原始模式,但是当我尝试创建新的嵌套Hash时,它会被展平。

这是我到目前为止所做的:

require 'json'
@schema = JSON.parse("{
  "fields": [
    {
      "group": "common",
      "key": "1st_level"
    },
    {
      "object": "nested",
      "key": "order",
      "fields": [
        {
          "group": "common",
          "key": "2nd_level_1"
        },
        {
          "object": "nested",
          "key": "order2",
          "fields": [
            {
              "group": "common",
              "key": "3rd_level_1"
            }
          ]
        }
      ]
    }
  ]
}
")
@event_output = Hash.new

def parse_config(fields)
    if fields["group"].downcase == "common"
      @response = "HIT HERE"
    else
      @response = "INVALID GROUP"
    end
    return @response
end

def loop_params(parent, key, schema)
  @new_output = Hash.new
  @parent = parent
  schema["fields"].each do |fields|
    if fields["object"].nil? & !fields["group"].nil?
      @key = fields["key"]
      @repsonse = parse_config(fields)
      @new_output[@key] = @repsonse
      if key != ""
        @parent[key] = @new_output
      else
        @parent = @new_output
      end
    else
      print @parent
      @key = fields["key"]
      loop_params(@parent, @key, fields)
    end
  end
  return @parent
end
@event_output = loop_params(@event_output, "", @schema)
print "\n FINAL OUTPUT \n"
print @event_output

这个输出是:

{
    "1st_level"=>"HIT HERE",
    "order"=>{
        "2nd_level_1"=>"HIT HERE"
    },
    "order2"=>{
        "3rd_level_1"=>"HIT HERE"
    }
}

虽然很接近,但我想:

{
    "1st_level"=>"HIT HERE",
    "order"=>{
        "2nd_level_1"=>"HIT HERE",
        "order2"=>{
            "3rd_level_1"=>"HIT HERE"
        }
    }   
}

2 个答案:

答案 0 :(得分:1)

您可能想要查看pretty_generate。请参阅“Ruby JSON.pretty_generate ... is pretty unpretty”和http://apidock.com/ruby/JSON/pretty_generate

需要哈希。

您的扁平字符串可能只需要再次使用JSON.parse进行解析。

答案 1 :(得分:1)

这可以解决您的问题:

def loop_params(schema)
  new_parent = Hash.new

  schema["fields"].each do |field|
    new_key = field["key"]

    if !field["group"].nil? && field["object"].nil?
      new_parent[new_key] = parse_config(field)
    else
      new_parent[new_key] = loop_params(field)
    end
  end

  new_parent
end

您的代码中可能存在一些可能导致错误的问题。使用@声明变量使其成为实例变量,这意味着它的值将在函数完成后保持不变。由于我们无法看到你的其他程序,我不知道你是否需要全部或任何一个,但我没有它们就写了我的解决方案。

其他一些注意事项:

if fields["object"].nil? & !fields["group"].nil?

您对&的使用实际上是按位运算符and,而不是条件and。请改用&&

此外,如果您使用puts代替printputs会自动为您添加"\n",这是一个很好的方便记住。