如何将哈希转换为 JSON,且转换后的字符串不包含反斜杠

Saf*_*S M 2 ruby ruby-on-rails ruby-on-rails-5

我正在使用 将哈希值转换为 JSON to_json,但转换后的字符串充满了反斜杠。如果我使用puts,它会显示正确的字符串,但如果我传入 a HTTP::NET request.body,则该字符串充满反斜杠。

data = {"a" => "b", "c" => "d", "e" => "f"}
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.path, {'Content-Type' =>'application/json', 
          'Authorization' => "xyz")
req.body = data.to_json
res = http.request(req)
Run Code Online (Sandbox Code Playgroud)

req.body正在发送:

"{\"a\":\"b\",\"c\":\"d\",\"e\":\"f\"}"
Run Code Online (Sandbox Code Playgroud)

我的请求因此失败。

我需要将数据发送为

"{"a" => "b", "c" => "d", "e" => "f"}"
Run Code Online (Sandbox Code Playgroud)

在请求正文中。

3li*_*t0r 6

看来您对字符串的实际内容感到困惑。反斜杠是字符串表示的一部分,但实际上并不在字符串中。

'"'以单个字符为例"。当您将其输入 irb 时,输出将是:

s = '"'
#=> "\""
Run Code Online (Sandbox Code Playgroud)

从结果中,"\""开始"和结束"标记字符串的开始和结束,同时\"是转义双引号,并表示单个"。这个双引号被转义的原因是你希望 Ruby 将其解释为一个"字符,而不是字符串的结尾。

您可以通过将字符串打印到控制台来查看不带转义字符的字符串的实际内容。

puts s
# "
#=> nil
Run Code Online (Sandbox Code Playgroud)

这里你可以看到字符串的内容中没有反斜杠。


这同样适用于您的to_json调用,它返回一个字符串:

data = {"a" => "b", "c" => "d", "e" => "f"}
json = data.to_json
#=> "{\"a\":\"b\",\"c\":\"d\",\"e\":\"f\"}"
puts json
# {"a":"b","c":"d","e":"f"}
#=> nil
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,字符串内容中没有反斜杠,只有字符串表示形式中没有。