将一个看起来像哈希数组的字符串变成真实数组的最佳方法是什么?
字符串看起来像这样:[{name:"lol", age:12},{name:"lmao", age:66},{name: "roflcopter", age:99}]
我需要得到完全相同但作为数组。
输入:(一个字符串)
'[{name:"lol", age:12},{name:"lmao", age:66},{name: "roflcopter", age:99}]'
预期输出:(一系列哈希值)
[{name:"lol", age:12},{name:"lmao", age:66},{name: "roflcopter", age:99}]
答案 0 :(得分:4)
你的字符串非常类似,但完全与JSON相同。这意味着您有三种选择。
您的字符串与正确的JSON字符串之间的唯一区别是,在JSON中,所有键都需要用引号括起来。如果您可以控制字符串的格式,我建议您将其更改为JSON格式:
'[{"name":"lol", "age":12},{"name":"lmao", "age":66},{"name": "roflcopter", "age":99}]'
一旦字符串采用这种格式,您就可以使用JSON.parse
将其转换为哈希数组:
require "json"
source_string = '[{"name":"lol", "age":12},{"name":"lmao", "age":66},{"name": "roflcopter", "age":99}]'
data = JSON.parse source_string
puts data[0] #=> {"name"=>"lol", "age"=>12}
我高度推荐这个行动方案。包含的JSON解析器以安全的方式处理所有字符串验证。而且,JSON基本上是为字符串形式提供数组和散列而设计的。这是一个人们会理解的广为接受的标准。
如果由于某种原因,您无法在默认情况下将源字符串更新为JSON(也许您正在与拒绝采用更好标准的第三方合作),您可以通过编程方式将字符串修改为正确的JSON格式。我实际上继续写了一个正则表达式,它将在字符串周围加上正确的引号:
source_string = '[{name:"lol", age:12},{name:"lmao", age:66},{name: "roflcopter", age:99}]'
json_string = source_string.gsub /(?<=[{,])\s*(\w+)(?=:)/, '"\1"'
data = JSON.parse json_string
puts data[0] #=> {"name"=>"lol", "age"=>12}
您的字符串采用当前格式,是有效的ruby代码。这意味着您可以使用eval
将其作为ruby代码执行:
data = eval('[{name:"lol", age:12},{name:"lmao", age:66},{name: "roflcopter", age:99}]')
puts data[0] #=>{name: "lol", age: 12}
eval
的问题,以及我和其他许多人强烈建议反对的问题,是它非常不安全。您说数据来自POST请求 - 如果您的用户碰巧修改了发送字符串&#34; system(&#39; rm *&#39;)&#34;的请求,您的代码将执行:
eval("system('rm *')")
正如您可能已经猜到的那样,将擦除您的硬盘。在运行eval
之前,您可以尝试编写字符串验证以确保字符串是安全的,但这种验证并不是一件容易的事,eval
可能永远是代码中最薄弱的一点。 ,从安全的角度来看。
老实说,没有理由你应该这样做,特别是因为选项#2非常简单直截了当。我只提到它,所以你知道要避免它。
答案 1 :(得分:0)
显然,第一选择是不将数据作为ruby源代码发送。但是,如果你真的必须这样做:
如果输入来自受信任的来源,您可以使用eval
。
否则,您可以使用ruby parser解析字符串,然后从AST生成数组和哈希值。