在Ruby中使用单引号将哈希序列化为类似于json的字符串

在Ruby中使用单引号将哈希序列化为类似于json的字符串,ruby,string,Ruby,String,是否有一种转换哈希(可能是嵌套的)的方法: {:event=>"subscribe", :channel=>"data_channel", :parameters=>{:api_key=>"XXX", :sign=>"YYY"}} 转换为以下指定格式的字符串 "{'event':'subscribe', 'channel':'data_channel', 'parameters': {'api_key':'XXX', 'sign':'YYY'}}" 编辑 该格式

是否有一种转换哈希(可能是嵌套的)的方法:

{:event=>"subscribe", :channel=>"data_channel", :parameters=>{:api_key=>"XXX", :sign=>"YYY"}}
转换为以下指定格式的字符串

"{'event':'subscribe', 'channel':'data_channel', 'parameters': {'api_key':'XXX', 'sign':'YYY'}}"
编辑


该格式提醒JSON,但实际上并不是由于单引号引起的。

您想要的输出看起来像JSON。试一试

require 'json'

JSON.dump(hash)
=> "{\"event\":\"subscribe\",\"channel\":\"data_channel\",\"parameters\":{\"api_key\":\"XXX\",\"sign\":\"YYY\"}}"

您想要的输出看起来像一个JSON。试一试

require 'json'

JSON.dump(hash)
=> "{\"event\":\"subscribe\",\"channel\":\"data_channel\",\"parameters\":{\"api_key\":\"XXX\",\"sign\":\"YYY\"}}"

要使用单引号,您可以尝试以下操作:

JSON.dump(hash).gsub('"', '\'')
它返回:

{'event':'subscribe','channel':'data_channel','parameters':{'api_key':'XXX','sign':'YYY'}}

要使用单引号,您可以尝试以下操作:

JSON.dump(hash).gsub('"', '\'')
它返回:

{'event':'subscribe','channel':'data_channel','parameters':{'api_key':'XXX','sign':'YYY'}}

制作JSON,然后进行修复:

require 'json'

hash = {:event=>"subscribe", :channel=>"data_channel",
        :parameters=>{:api_key=>"XXX", :sign=>%q{Miles "Chief" O'Brien}}}

puts hash.to_json.gsub(/"((?:\\[\"]|[^\"])*)"/) { |x|
  %Q{'#{$1.gsub(/'|\\"/, ?' => %q{\'}, %q{\\"} => ?")}'}
}
# => {'event':'subscribe','channel':'data_channel',
#    'parameters':{'api_key':'XXX','sign':'Miles "Chief" O\'Brien'}}
编辑:第一个正则表达式表示:匹配双引号,然后是转义双引号/反斜杠或非双引号/反斜杠字符序列,然后再次匹配双引号。这确保我们只找到字符串,而不是像
“Miles\”
这样的意外半字符串。对于每个这样的字符串,我们将双引号(
$1
)中的位用单引号括起来,并在其上运行一个子替换,找到转义双引号和未转义单引号,对前者进行转义,对后者进行转义


另外,对于突出显示的问题,我很抱歉,StackOverflow语法highlighter似乎无法处理Ruby引号的其他形式,但当您使用引号字符时,它们非常方便…

生成JSON,然后进行修复:

require 'json'

hash = {:event=>"subscribe", :channel=>"data_channel",
        :parameters=>{:api_key=>"XXX", :sign=>%q{Miles "Chief" O'Brien}}}

puts hash.to_json.gsub(/"((?:\\[\"]|[^\"])*)"/) { |x|
  %Q{'#{$1.gsub(/'|\\"/, ?' => %q{\'}, %q{\\"} => ?")}'}
}
# => {'event':'subscribe','channel':'data_channel',
#    'parameters':{'api_key':'XXX','sign':'Miles "Chief" O\'Brien'}}
编辑:第一个正则表达式表示:匹配双引号,然后是转义双引号/反斜杠或非双引号/反斜杠字符序列,然后再次匹配双引号。这确保我们只找到字符串,而不是像
“Miles\”
这样的意外半字符串。对于每个这样的字符串,我们将双引号(
$1
)中的位用单引号括起来,并在其上运行一个子替换,找到转义双引号和未转义单引号,对前者进行转义,对后者进行转义



另外,很抱歉突出显示不可靠,StackOverflow语法highlighter似乎无法处理Ruby引号的其他形式,但它们在处理引号字符时非常方便…

“有办法吗”-是的,它被称为“序列化”。通常像“ruby hash to”这样的谷歌查询会帮助我。什么是
ws\u client.send str
?这与你的问题有关吗?请不要写无关的东西。如果您试图暗示字符串应为JSON格式,请显式编写,而不是隐式编写。@sawa这是为了强调WS-server只接受指定的格式。它拒绝任何其他格式,包括带有双引号的字符串“有办法吗”-是的,它被称为“序列化”。通常像“ruby hash to”这样的谷歌查询会帮助我。什么是
ws\u client.send str
?这与你的问题有关吗?请不要写无关的东西。如果您试图暗示字符串应为JSON格式,请显式编写,而不是隐式编写。@sawa这是为了强调WS-server只接受指定的格式。它拒绝任何其他格式,包括带双引号的字符串。如果字符串包含双引号,则将其替换为单引号。这似乎不是一个好主意。@Ursus:而且它会使json无效。是的,但问题不是生成json?它是关于将散列转换为一个带引号的类似json的字符串。OP可以自行决定是否使用该逻辑(基于他正在处理的数据类型)。我对第一条评论投了赞成票,因为突出并提及这样一个副作用/潜在错误是有意义的。@SergioTulentsev也一样,但用户从未说过JSON,所以我还不是100%确定:D@Ursus:没错,他们没有。我仍然98%确定它是json,不过:)如果字符串包含双引号,则将其替换为单引号。这似乎不是一个好主意。@Ursus:而且它会使json无效。是的,但问题不是生成json?它是关于将散列转换为一个带引号的类似json的字符串。OP可以自行决定是否使用该逻辑(基于他正在处理的数据类型)。我对第一条评论投了赞成票,因为突出并提及这样一个副作用/潜在错误是有意义的。@SergioTulentsev也一样,但用户从未说过JSON,所以我还不是100%确定:D@Ursus:没错,他们没有。我仍然98%确定它是json,虽然:)看起来不错,但我需要单引号字符串。正如您所提到的,仅仅替换引号不是很好,我查看了JSON.generate,但找不到quotes的选项,因为单引号不是JSON的选项。JSON规范需要双引号如果你真的需要单引号,那么JSON就不是你想要的是的,它是一种非常奇怪的格式,就像用括号括起来的YAML,但这是我作为websocket客户端必须处理的,看起来不错,但我需要单引号字符串。正如您所提到的,仅仅替换引号不是很好,我查看了JSON.generate,但找不到quotes的选项,因为单引号不是JSON的选项。JSON规范需要双引号如果你真的需要单引号,那么JSON就不是你想要的是的,它是一种非常奇怪的格式,就像用括号括起来的YAML,但这正是我作为websocket客户端必须处理的