如何在转换后的字符串不充满反斜杠的情况下将散列转换为 JSON

How to convert a hash to JSON without the converted string being full of backslashes

我正在使用 to_json 将散列转换为 JSON,但转换后的字符串充满了反斜杠。如果我使用 puts,它会显示正确的字符串,但如果我传入 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)

req.body 正在发送:

"{\"a\":\"b\",\"c\":\"d\",\"e\":\"f\"}"

因此我的请求失败了。

我需要发送数据为

"{"a" => "b", "c" => "d", "e" => "f"}"

在请求正文中。

您可以通过两种解决方案处理此问题:您可以在要使用它的地方解析 JSON,或者您也可以从 Ruby 代码发送已解析的 JSON。

req.body = JSON.parse(data.to_json)

它将 return 结果如下:

{"a"=>"b", "c"=>"d", "e"=>"f"}

这取决于您要在哪里解析数据。如果你想在前端解析,只需使用 jQuery 的 JSON 解析函数。

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

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

s = '"'
#=> "\""

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

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

puts s
# "
#=> nil

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


这同样适用于您的 to_json 调用,其中 returns 一个字符串:

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

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

完全理解斜线是接受的字符串转义,但有些应用程序不接受它 IE Amazon Connect。

req.body = JSON.parse(data.to_json)

完美运行。

尝试as_json which might be more appropriate given what you're attempting. This is a good explanation of which to use and whenas_json 将产生未转义的 json.