我使用Ruby 2.2并且有一个如下所示的字符串:
myvar = '{"myval1"=>"value1","mayval2"=>"value2"}'
如何将其转换为键值对和/或某种哈希值?当我myvar['myval1']
时,我会回来'myval1'
,这不是我之后的事情。答案可能正好盯着我,但到目前为止还没有任何工作。
答案 0 :(得分:3)
正如我多次看到的那样 - 简单地提及eval
会让人立即感到不安,即使这是一个正确的用例(事实并非如此)。
所以我将使用另一个讨厌的磁铁 - 用正则表达式解析嵌套结构。
迭代(1) - 一种天真的方法:
JSON.parse(myvar.gsub(/=>/, ':'))
问题 - 如果字符串键/值包含=>
,则会弄乱您的数据。
迭代(2) - 偶数个"
表示你不在字符串中:
JSON.parse(myvar.gsub(/=>(?=(?:[^"]*"){2}*[^"]*$)/, ':'))
问题 - 字符串中可能有一个"
,用斜杠进行转义。
迭代(3) - 类似迭代(2),但只计算前面有非转义斜杠的"
。未转义的斜杠将是一系列奇数斜线:
eq_gt_finder = /(?<non_quote>
(?:
[^"\\]|
\\{2}*\\.
)*
){0}
=>(?=
(?:
\g<non_quote>
"
\g<non_quote>
){2}*
$
)/x
JSON.parse(myvar.gsub(eq_gt_finder, ':'))
问:你是一个绝对可靠的神圣生物,绝对肯定这会在100%的时间内起作用吗?
A:没有。
问:这不是很慢而且不可读吗?
问:好吗?
A:是的。
答案 1 :(得分:2)
您可以轻松地将该字符串更改为有效JSON
,然后使用JSON.parse
:
require 'JSON'
myvar = '{"myval1"=>"value1","mayval2"=>"value2"}'
hash = JSON.parse(myvar.gsub(/=>/, ': '))
#=> { "myval1" => "value1", "mayval2" => "value2" }
hash['myval1']
#=> "value1"