【问题标题】:How to parse single-string array to hash in Ruby?如何在 Ruby 中解析单字符串数组以散列?
【发布时间】:2016-07-25 23:03:54
【问题描述】:

我有一个 Ruby 数组(不要问我为什么它还不是哈希,我对此无能为力):

[{":cost=>100", ":size=>2"}]

我需要做些什么才能使它成为带有键和值的经典 Ruby 散列? 我最好的选择是什么?也许有一些用于这种操作的库?

谢谢。

【问题讨论】:

  • 您发布的代码无效。我认为你放错了(或插入){}
  • 可能是eval('{' + [":cost=>100", ":size=>2"].join(',') + '}')?
  • 其实没有。当我尝试直观地验证数据时,这就是我使用“puts”命令得到的结果。当我用 puts(MyClass.class) 打印这个对象的类名时,我得到了“Array”类。
  • @AlexSid,你的意思是,如果你这样做you_obj.to_s,你会得到"[{\":cost=>100\", \":size=>2\"}]"
  • 你展示了一个数组。如果是字符串,则显示字符串(即,用单引号或双引号括起来)。

标签: arrays ruby parsing hash converter


【解决方案1】:

首先我们需要清理字符串,使它看起来像一个有效的数组:

my_string = my_string[2..-3]
my_array = eval("[#{my_string}]")

现在您可以加入字符串,然后将其评估为哈希:

elements = my_array.join(', ')
my_hash = eval("{ #{ elements } }")

(这可以用更少的行来完成,但为了清楚起见,我将它们分开)

【讨论】:

  • 值得注意的是,无论何时使用eval,您都应该格外小心不要执行任意字符串。绝对确保这些数据来自受信任的来源。
【解决方案2】:

您可以使用JSON 模块来执行此操作。这可以说比使用eval 更安全。

要了解如何使用JSON,让我们进行一些逆向工程。你想创建一个哈希:

h = { :cost=>100, :size=>2 }

来自字符串:

str = '[{":cost=>100", ":size=>2"}]'
  #=> "[{\":cost=>100\", \":size=>2\"}]"

让我们看看如何将该哈希编码为 JSON 字符串:

require 'json'
jstr = JSON.generate(h)
  #=> "{\"cost\":100,\"size\":2}" 

一旦我们有了jstr(只不过是一个字符串),我们就可以提取所需的哈希:

JSON.parse(jstr)
  #=> {"cost"=>100, "size"=>2}

所以任务简化为将str 转换为jstr

  "[{\":cost=>100\", \":size=>2\"}]" => "{\"cost\":100,\"size\":2}" 

也许最简单的方法是首先提取键和值,我们可以使用正则表达式:

r = /
    (       # start capture group 1
      [a-z] # match a lowercase letter
      \w*   # match >= 0 word characters
    )       # close capture group 1
    =>      # match characters
    (-?\d+) # optionally match a minus sign followed by > 0 digits in
            # capture group 2
    /x      # free-spacing regex definition mode

arr = str.scan r
  #=> [["cost", "100"], ["size", "2"]]

我们现在可以形成jstr:

jstr = "{#{ arr.map { |k,v| "\"#{k}\":#{v}" }.join(",") }}" 
  #=> "{\"cost\":100,\"size\":2}"

确认,

h = JSON.parse(jstr)
  #=> {"cost"=>100, "size"=>2}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-22
    • 2023-04-07
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2017-11-10
    • 2017-12-21
    相关资源
    最近更新 更多