Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何转换此';散列式';字符串到键值对_Ruby - Fatal编程技术网

Ruby 如何转换此';散列式';字符串到键值对

Ruby 如何转换此';散列式';字符串到键值对,ruby,Ruby,我使用的是Ruby 2.2,有一个字符串如下所示: myvar = '{"myval1"=>"value1","mayval2"=>"value2"}' 我如何将其放入键值对和/或某种散列中?当我做myvar['myval1']时,我得到了'myval1',这不是我想要的。答案可能就在我眼前,但到目前为止还没有任何结果。您可以轻松地将该字符串更改为有效的JSON,然后使用JSON.parse: require 'JSON' myvar = '{"myval1"=>"value

我使用的是Ruby 2.2,有一个字符串如下所示:

myvar = '{"myval1"=>"value1","mayval2"=>"value2"}'

我如何将其放入键值对和/或某种散列中?当我做
myvar['myval1']
时,我得到了
'myval1'
,这不是我想要的。答案可能就在我眼前,但到目前为止还没有任何结果。

您可以轻松地将该字符串更改为有效的
JSON
,然后使用
JSON.parse

require 'JSON'
myvar = '{"myval1"=>"value1","mayval2"=>"value2"}'

hash = JSON.parse(myvar.gsub(/=>/, ': '))
#=> { "myval1"  => "value1", "mayval2" => "value2" }

hash['myval1']
#=> "value1"

您可以轻松地将该字符串更改为有效的
JSON
,然后使用
JSON.parse

require 'JSON'
myvar = '{"myval1"=>"value1","mayval2"=>"value2"}'

hash = JSON.parse(myvar.gsub(/=>/, ': '))
#=> { "myval1"  => "value1", "mayval2" => "value2" }

hash['myval1']
#=> "value1"

正如我一次又一次地看到的那样——简单地提到
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, ':'))
eq\u gt\u finder=/(?
(?:
[^"\\]|
\\{2}*\\.
)*
){0}
=>(?=
(?:
\g
"
\g
){2}*
$
)/x
parse(myvar.gsub(eq_gt_finder,':'))


Q:你是一个绝对肯定会100%成功的绝对可靠的神祗吗

A:没有

问:这不是很慢,很难读懂吗

Q:可以吗


A:是的。

正如我一次又一次看到的那样-简单地提到
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, ':'))
eq\u gt\u finder=/(?
(?:
[^"\\]|
\\{2}*\\.
)*
){0}
=>(?=
(?:
\g
"
\g
){2}*
$
)/x
parse(myvar.gsub(eq_gt_finder,':'))


Q:你是一个绝对肯定会100%成功的绝对可靠的神祗吗

A:没有

问:这不是很慢,很难读懂吗

Q:可以吗


A:是的。

我以微弱优势输了一票,但这是重复票。那根绳子是从哪里来的?有可能以不同的格式获取输入吗?@spickermann我们正在将其作为外部api调用的一部分获取,我们无法控制其输出。我的得票率很低,但这是重复的。那根绳子是从哪里来的?是否可以以不同的格式获取输入?@spickermann我们将作为外部api调用的一部分获取它,我们无法控制其输出。您可能需要读取,这将扩展主题。我希望你觉得它很刺激(或者至少很有趣)。你可能想阅读,这就扩展了主题。我希望你觉得这很刺激(或者至少很有趣)。