我有一个看起来像散列的字符串:
"{ :key_a => { :key_1a => 'value_1a', :key_2a => 'value_2a' }, :key_b => { :key_1b => 'value_1b' } }"我怎样才能从中得到一个哈希呢?像这样:
{ :key_a => { :key_1a => 'value_1a', :key_2a => 'value_2a' }, :key_b => { :key_1b => 'value_1b' } }字符串可以有任意深度的嵌套。它具有在Ruby中如何输入有效Hash的所有属性。
发布于 2015-06-09 14:20:52
到目前为止,解决方案涵盖了一些情况,但遗漏了一些情况(见下文)。下面是我对更彻底(安全)的转换的尝试。我知道有一种解决方案不能处理的情况,那就是由奇怪但允许的字符组成的单字符符号。例如,{:> => :<}是一个有效的ruby散列。
我把这个code up on github as well。此代码以一个测试字符串开始,以执行所有转换
require 'json'
# Example ruby hash string which exercises all of the permutations of position and type
# See http://json.org/
ruby_hash_text='{"alpha"=>{"first second > third"=>"first second > third", "after comma > foo"=>:symbolvalue, "another after comma > foo"=>10}, "bravo"=>{:symbol=>:symbolvalue, :aftercomma=>10, :anotheraftercomma=>"first second > third"}, "charlie"=>{1=>10, 2=>"first second > third", 3=>:symbolvalue}, "delta"=>["first second > third", "after comma > foo"], "echo"=>[:symbol, :aftercomma], "foxtrot"=>[1, 2]}'
puts ruby_hash_text
# Transform object string symbols to quoted strings
ruby_hash_text.gsub!(/([{,]\s*):([^>\s]+)\s*=>/, '\1"\2"=>')
# Transform object string numbers to quoted strings
ruby_hash_text.gsub!(/([{,]\s*)([0-9]+\.?[0-9]*)\s*=>/, '\1"\2"=>')
# Transform object value symbols to quotes strings
ruby_hash_text.gsub!(/([{,]\s*)(".+?"|[0-9]+\.?[0-9]*)\s*=>\s*:([^,}\s]+\s*)/, '\1\2=>"\3"')
# Transform array value symbols to quotes strings
ruby_hash_text.gsub!(/([\[,]\s*):([^,\]\s]+)/, '\1"\2"')
# Transform object string object value delimiter to colon delimiter
ruby_hash_text.gsub!(/([{,]\s*)(".+?"|[0-9]+\.?[0-9]*)\s*=>/, '\1\2:')
puts ruby_hash_text
puts JSON.parse(ruby_hash_text)这里有一些关于其他解决方案的说明
eval,这对我来说太可怕了(正如out).eval有效,如果没有与solution混合的带引号的字符串,solution有效,如果您的符号没有使用所有允许的字符solution C24<有效只要不混合使用符号和带引号的字符串,/code>就可以工作。https://stackoverflow.com/questions/1667630
复制相似问题