首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将String对象转换为Hash对象?

如何将String对象转换为Hash对象?
EN

Stack Overflow用户
提问于 2009-11-03 22:24:21
回答 15查看 215.4K关注 0票数 147

我有一个看起来像散列的字符串:

代码语言:javascript
复制
"{ :key_a => { :key_1a => 'value_1a', :key_2a => 'value_2a' }, :key_b => { :key_1b => 'value_1b' } }"

我怎样才能从中得到一个哈希呢?像这样:

代码语言:javascript
复制
{ :key_a => { :key_1a => 'value_1a', :key_2a => 'value_2a' }, :key_b => { :key_1b => 'value_1b' } }

字符串可以有任意深度的嵌套。它具有在Ruby中如何输入有效Hash的所有属性。

EN

Stack Overflow用户

发布于 2015-06-09 14:20:52

到目前为止,解决方案涵盖了一些情况,但遗漏了一些情况(见下文)。下面是我对更彻底(安全)的转换的尝试。我知道有一种解决方案不能处理的情况,那就是由奇怪但允许的字符组成的单字符符号。例如,{:> => :<}是一个有效的ruby散列。

我把这个code up on github as well。此代码以一个测试字符串开始,以执行所有转换

代码语言:javascript
复制
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)

这里有一些关于其他解决方案的说明

  • @Ken Bloom和out).
  • @zolter's的解决方案使用eval,这对我来说太可怕了(正如out).
  • @zolter‘s正确地指出,如果您的散列没有符号或数字,则@Toms Mikosseval有效,如果没有与solution混合的带引号的字符串,solution有效,如果您的符号没有使用所有允许的字符solution C24<有效只要不混合使用符号和带引号的字符串,/code>就可以工作。
票数 22
EN
查看全部 15 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1667630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档