【问题标题】:Convert keys and values of a hash to string将哈希的键和值转换为字符串
【发布时间】:2013-03-02 01:17:10
【问题描述】:

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

我需要转换

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

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

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

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

我该怎么做?

【问题讨论】:

  • 为此使用 Ruby 的 URI 类。

标签: ruby


【解决方案1】:

这个呢

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

【讨论】:

    【解决方案2】:

    不要重新发明一个成熟的轮子。相反,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 发送。

    【讨论】:

    • 但这与我需要的不同。如您所见,此方法将x 设置为多个值。我需要它来接收一个值;字符串"[1,2,3,4]"。那是不同的。
    猜你喜欢
    • 1970-01-01
    • 2019-08-26
    • 2015-08-24
    • 2012-12-12
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    相关资源
    最近更新 更多