将哈希的键和值转换为字符串

时间:2013-03-02 01:17:11

标签: ruby

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

我需要转换

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

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

将符号转换为字符串非常重要,并且数组用引号括起来。

  • to_json返回一个字符串并没有解决我的问题;我需要哈希作为回报。
  • 哈希可能包含更多键和值,因此我无法对每个键或值进行硬编码{。}}。

我该如何表演?

2 个答案:

答案 0 :(得分:10)

这个怎么样?

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]"}

答案 1 :(得分: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轻松发送。