Ruby最好的方法是使这个字符串成为一个数组?

时间:2017-08-14 19:45:31

标签: ruby parsing

将一个看起来像哈希数组的字符串变成真实数组的最佳方法是什么?

字符串看起来像这样:[{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}]

2 个答案:

答案 0 :(得分:4)

你的字符串非常类似,但完全与JSON相同。这意味着您有三种选择。

1)将其转换为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基本上是为字符串形式提供数组和散列而设计的。这是一个人们会理解的广为接受的标准。

2)将其转换为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}

3)使用eval

您的字符串采用当前格式,是有效的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生成数组和哈希值。