使用eval将字符串转换为哈希

时间:2016-01-07 13:49:08

标签: ruby-on-rails ruby eval

我有这样的字符串

a="{\"company\"=>\"khkhkh\", \"email\"=>\"hjkh@hkkj.kjh\",\"address\"=>\"yiyiyu\", \"date\"=>Mon, 28 Apr 2014 13:14:10 BST +01:00}"

但是在生成这个字符串时我犯了一个错误。也就是说,我附加日期而不转换为字符串。所以现在如果我尝试使用 eval(a)将其恢复为哈希值。这会引发错误,这是可以接受的。

SyntaxError: (eval):1: syntax error, unexpected tCONSTANT, expecting => ....

有没有办法让哈希回来,因为我无法重新生成这个字符串。

任何帮助都会非常值得注意。 感谢。

3 个答案:

答案 0 :(得分:2)

对于你的直接困境:

a.gsub(/\"date\"\s*=>(.*?)(\}|,\s*\")/, '"date"=>"\1"\2')

即使日期不是哈希的最后一个条目,这也应该有效。

下一次:真的通过手动将数据转换为您eval之后的代码来序列化数据不是一个好主意。 在大多数情况下,最好的选择可能只是生成JSON并稍后解析。使用适当的JSON序列化器/生成器还可以确保您的数据在语法上是正确的。

答案 1 :(得分:1)

如果日期总是最后一次,你可以采用直截了当的方法:

date = a.gsub(/[\{\}]/, '').split('=>').last
a.gsub(date, "\"#{date}\"")

将返回

"{\"company\"=>\"khkhkh\", \"email\"=>\"hjkh@hkkj.kjh\",\"address\"=>\"yiyiyu\", \"date\"=>\"Mon, 28 Apr 2014 13:14:10 BST +01:00\"}"

答案 2 :(得分:1)

如果您有多个日期,请尝试使用regexp:

替换引号日期
wrong_data = "" # your string
correct_data = wrong_data.gsub(/(\w{3}, \d{2} \w{3} \d{4} \d{2}:\d{2}:\d{2} \w{3} \+\d{2}:\d{2})/, '"\1"')
eval(correct_data)

PS。正如@Gene真正注意到的那样,您应该避免在代码中使用eval