将具有整数键的Ruby哈希表更改为字符串键

8

我在Ruby中用整数键创建了一个哈希表,并将其作为JSON响应发送。然后解析该JSON并将哈希表转换回Ruby。现在,键是字符串文字。

我知道JSON不支持整数键,但我发现了一种方法,可以解析哈希表,使其具有符号键。

JSON.parse(hash, {:symbolize_names => true})

有没有类似的函数可以获取回原始的整数键?
a = {1 => 2}
a.keys
=> [1]
b = JSON.parse(JSON.generate(a))
b.keys
=> ["1"]

我的哈希非常复杂。值本身是一个哈希,应该具有整数键。有多个这样的嵌套级别。


1
当然,可以遍历键,将它们转换为整数,并将它们的值设置为原始字符串键的值。 - Dave Newton
2个回答

7
据我所知,JSON中没有“Nothing”的概念,但转换很容易:

请点击此处 了解更多信息。

json_hash = {"1" => "2" }
integer_hash = Hash[json_hash.map{|k,v|[ k.to_i, v.to_i ]}]
=> {1 => 2}

因此,我们从初始哈希表(json_hash)中获取所有关键字和值,对它们调用to_i方法,并将它们放入一个新的哈希表(integer_hash)中。

即使嵌套也不会阻塞。您可以在一个方法中完成这个过程:

def to_integer_keys(hash)
  keys_values = hash.map do |k,v|
    if(v.kind_of? Hash)
      new_value = to_integer_keys(v) #it's a hash, let's call it again
    else
      new_value = v.to_i #it's a integer, let's convert
    end

    [k.to_i, new_value]
  end

  Hash[keys_values]
end

问题在于我的哈希表非常复杂。该值本身是一个哈希表,应该具有整数键。有多个这样的嵌套层级。 - DanMatlin
然后只需递归执行即可。Avdi Grimm 发布了一种方法,适用于YAML和字符串/符号,将其与Martin的答案结合起来以满足您的需求应该很容易。 - Kolja

1

使用内置方法通过传递所需的块进行正常键转换

hash1 = {'1' => {'2' => 'val2', '3' => 'val3'}} 
p hash1.transform_keys(&:to_i)

{1=>{"2"=>"val2", "3"=>"val3"}}

通过传递所需的块来实现嵌套键转换解决方案。
class Hash
  def deep_transform_keys(&block)
    result = {}
    each do |key, value|
      result[yield(key)] = value.is_a?(Hash) ? value.deep_transform_keys(&block) : value
    end
    result
  end
end
hash1 = {'1' => {'2' => 'val2', '3' => 'val3'}} 
p hash1.deep_transform_keys(&:to_i)

{1=>{2=>"val2", 3=>"val3"}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接