2013-03-21 108 views
3

我可以從字符串轉換http_params哈希

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,這樣我可以做一個Rest客戶端發送myhash.to_json調用。基本上,它應該是鍵,值對喜歡:

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

我知道,反向操作可以這樣做:

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

,但我無法想出這個整潔的代碼。

我應該怎麼做這個最好的方法是什麼?

回答

4
require 'cgi' 
hash = CGI::parse http_params 

或者你可以使用:

hash = Rack::Utils.parse_nested_query http_params 

沒有返回值作爲數組。

+0

就是這樣?真的很簡單。 :-) – 2013-03-21 14:05:18

+1

鍵是字符串,但由於某些原因,這些值會變成單個元素數組:「{」created_end_date「=> [」2013-02-28「],」created_start_date「=> [」2013-01-01「 ],...}'。我想知道爲什麼。 – Mischa 2013-03-21 14:06:24

+0

我想知道同樣的事情....當我做hash.to_json時,我得到{\「created_end_date \」:[\「2013-02-28 \」] ...} – 2013-03-21 14:12:03

2

純Ruby方法,您可以將字符串轉換成散列如下:

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

作爲最後一步,必須完成內部哈希元素的合併。可以這樣做:

"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"} 
+0

雖然這似乎不是所需的輸出。 – Mischa 2013-03-21 14:08:36

+0

我添加了一個應該顯示如何使用to_sym來獲取符號鍵的示例 – poseid 2013-03-21 14:17:38

+0

我並不是在談論符號與字符串。這將返回一個包含大量散列的數組。他似乎想要一個有很多元素的散列。例如。 '{:a =>'1',:b =>'2'}' – Mischa 2013-03-21 14:18:44