2013-03-02 109 views
1

我需要将哈希的值和密钥转换为字符串,以便正确地将其准备为参数Net::HTTP.post_form。例如:将密钥和哈希值转换为字符串

我需要转换

{:x => [1,2,3,4]} 

{"x"=>"[1, 2, 3, 4]"} 

到符号转换为字符串是很重要的,并且阵列用引号括起来。

  • to_json返回一个字符串,并不能解决我的问题;我需要一个散列作为回报。
  • 哈希可能有更多的键和值,所以我不能硬编码to_s到每个键或值。

我该如何执行它?

+0

为此使用Ruby的URI类。 – 2013-03-02 05:16:15

回答

9

这个怎么样

Hash[ { :x => [1,2,3,4] }.map { |k, v| [k.to_s, v.to_s] } ] 
#=> {"x"=>"[1, 2, 3, 4]"} 

或者对红宝石> = 2.1

{ :x => [1,2,3,4] }.map { |k, v| [k.to_s, v.to_s] }.to_h 
#=> {"x"=>"[1, 2, 3, 4]"} 
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发送。

+0

但这与我所需要的不同。如你所见,这个方法用多个值设置'x'。我需要它接受一个单一的价值;字符串'“[1,2,3,4]”'。那不一样。 – 2013-03-03 15:42:18

相关问题