我需要将哈希的值和键转换为字符串,以便正确地将其准备为Net::HTTP.post_form
. 例如:
我需要转换
{:x => [1,2,3,4]}
至
{"x"=>"[1, 2, 3, 4]"}
将符号转换为字符串并且数组用引号括起来很重要。
to_json
返回一个字符串并不能解决我的问题;我需要一个哈希作为回报。- 哈希可能有更多的键和值,所以我不能
to_s
对每个键或值进行硬编码。
我该如何执行?
我需要将哈希的值和键转换为字符串,以便正确地将其准备为Net::HTTP.post_form
. 例如:
我需要转换
{:x => [1,2,3,4]}
至
{"x"=>"[1, 2, 3, 4]"}
将符号转换为字符串并且数组用引号括起来很重要。
to_json
返回一个字符串并不能解决我的问题;我需要一个哈希作为回报。to_s
对每个键或值进行硬编码。我该如何执行?
那这个呢
Hash[ { :x => [1,2,3,4] }.map { |k, v| [k.to_s, v.to_s] } ]
#=> {"x"=>"[1, 2, 3, 4]"}
或者在 Ruby >= 2.1
{ :x => [1,2,3,4] }.map { |k, v| [k.to_s, v.to_s] }.to_h
#=> {"x"=>"[1, 2, 3, 4]"}
或者在 Ruby >= 2.6
{ :x => [1,2,3,4] }.to_h { |k, v| [k.to_s, v.to_s] }
#=> {"x"=>"[1, 2, 3, 4]"}
不要重新发明一个完善的轮子。相反,Ruby 的URI是一个很好的使用工具:
require 'uri'
uri = URI.parse('http://www.example.com')
uri.query = URI.encode_www_form( {:x => [1,2,3,4]} )
uri.to_s # => "http://www.example.com?x=1&x=2&x=3&x=4"
如果您只需要查询值:
query = URI.encode_www_form( {:x => [1,2,3,4]} ) # => "x=1&x=2&x=3&x=4"
如果您打算通过 Net::HTTP 发送它,这听起来真的像是在重新发明轮子。将哈希序列化为{"x"=>"[1, 2, 3, 4]"}
将限制您的代码仅使用您的代码。使用 JSON、YAML 或 XML 将使您的生活更轻松,您的代码更便携。
JSON 可以很容易地在机器之间移动哈希,在 Ruby/Python/Java/Perl 等语言之间,无论是浏览器到服务器,还是客户端到服务器:
require 'json'
hash = {:x => [1,2,3,4]}
hash.to_json
=> "{\"x\":[1,2,3,4]}"
JSON[hash.to_json]
=> {
"x" => [
[0] 1,
[1] 2,
[2] 3,
[3] 4
]
}
这是散列的往返,到 JSON 的表示,再回到散列。中间字符串"{\"x\":[1,2,3,4]}"
很容易通过 Net::HTTP 发送。