将http_params转换为哈希

时间:2013-03-21 13:57:10

标签: ruby-on-rails ruby ruby-on-rails-3

我可以从字符串中获取一个数组

http_params="created_end_date=2013-02-28&created_start_date=2013-01-01&page_size=50&offset=0&order_id=0D1108211501118%0D%0A0D11108211501118%0D%0Ac%0D%0AD%0D%0ADK212071409743%0D%0AKK30109110100%0D%0AKK30111140300%0D%0AKK30111140400%0D%0AKK30115120100%0D%0AKK30115150100&page_number=1"

所以我做了myarray=http_params.split("&")

myarray=["created_end_date=2013-02-28", "created_start_date=2013-01-01", "page_size=50", "offset=0", "order_id=0D1108211501118%0D%0A0D11108211501118%0D%0Ac%0D%0AD%0D%0ADK212071409743%0D%0AKK30109110100%0D%0AKK30111140300%0D%0AKK30111140400%0D%0AKK30115120100%0D%0AKK30115150100", "page_number=1"] 

我需要将其转换为哈希myhash,以便我可以为myhash.to_json进行Rest Client调用。基本上它应该是关键的,价值对,如:

{:created_end_date=>"2013-02-28",:created_start_date=>"2013-01-01"....}

我知道逆操作可以这样做:

http_params = myhash.map{|k,v| "#{k}=#{v}"}.join('&')

但我无法为此提出整洁的代码。

我应该采取什么样的最佳方式?

2 个答案:

答案 0 :(得分:5)

require 'cgi'
hash = CGI::parse http_params

或者您可以使用:

hash = Rack::Utils.parse_nested_query http_params

不会将值作为数组返回。

答案 1 :(得分:2)

使用纯Ruby方法,您可以将字符串转换为Hash,如下所示:

"a=1&b=2".split('&').map { |h| Hash[*h.split("=")] }
=> [{"a"=>"1"}, {"b"=>"2"}]

如何操作Ruby集合的博客文章在这里:http://thinkingonthinking.com/map-reduce-in-ruby/

要将符号作为键,需要一小步:

"a=1&b=2".split('&').map { |h| hs = h.split("="); Hash[hs[0].to_sym, hs[1]] }
=> [{:a=>"1"}, {:b=>"2"}]

作为最后一步,必须完成内部Hash元素的合并。这可以这样做:

"a=1&b=2".split('&').map { |h| hs = h.split("="); Hash[hs[0].to_sym, hs[1]] }.inject({}) { |s, h| s.merge(h) }
=> {:a=>"1", :b=>"2"}
相关问题