Leventix,感谢您的回答。
Marshal.load(Marshal.dump(h)) 方法可能是各种方法中最完整的,因为它递归地保留了原始密钥类型。 p>
如果您有一个包含字符串和符号键混合的嵌套哈希,并且您希望在解码时保留该混合(例如,如果您的哈希包含您自己的自定义对象以及高度复杂的对象,则可能会发生这种情况/嵌套的第三方对象,无论出于何种原因,您都无法对其键进行操作/转换,例如项目时间限制)。
例如:
h = {
:youtube => {
:search => 'daffy', # nested symbol key
'history' => ['goofy', 'mickey'] # nested string key
}
}
方法 1:JSON.parse - 递归地表示所有键 => 不保留原始组合
JSON.parse( h.to_json, {:symbolize_names => true} )
=> { :youtube => { :search=> "daffy", :history => ["goofy", "mickey"] } }
方法 2:ActiveSupport::JSON.decode - 仅象征顶级键 => 不保留原始组合
ActiveSupport::JSON.decode( ActiveSupport::JSON.encode(h) ).symbolize_keys
=> { :youtube => { "search" => "daffy", "history" => ["goofy", "mickey"] } }
方法 3:Marshal.load - 在嵌套键中保留原始字符串/符号组合。完美!
Marshal.load( Marshal.dump(h) )
=> { :youtube => { :search => "daffy", "history" => ["goofy", "mickey"] } }
除非有我不知道的缺点,否则我认为方法 3 是可行的方法。
干杯