使用gsub替换“=>”在哈希数组中使用“:”

时间:2016-08-10 19:51:11

标签: json ruby parsing hash gsub

我想我已经把自己写在了一个角落里。基本上,我有一系列哈希,就像这样。

 my_hashes = [{"colorName"=>"first", "hexValue"=>"#f00"}, {"colorName"=>"green", "hexValue"=>"#0f0"}, 
    {"colorName"=>"blue", "hexValue"=>"#00f"}, {"colorName"=>"cyan", "hexValue"=>"#0ff"}, 
    {"colorName"=>"magenta", "hexValue"=>"#f0f"}, {"colorName"=>"yellow", "hexValue"=>"#ff0"}, 
    {"colorName"=>"black", "hexValue"=>"#000"}]

我需要使用JSON.parse最终能够将这些哈希值转换为CSV格式。唯一的问题是我无法让JSON.parse工作只要“=>”符号存在。我试过做一个普通的gsub('=>',':'),但似乎我不能使用它,因为这是一个哈希数组。我尝试过以下方法的变体:

my_hashes.each do |hash| 
    hash.each do |key, value|
        key.gsub!('=>', ':')
        value.gsub!('=>', ':')
    end
end

我需要这些哈希值保持不变,所以即使我将它们转换为intro字符串,如果我将它们转换回来,它们仍然会有'=>'符号可用。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

=>更改为:不会将Ruby哈希变为JSON对象。事实上,你根本不能像这样改变哈希。因为散列的书面表示与内存中的解释版本不同。

但这并不能解决您的问题:您需要JSON表示Ruby哈希,只需使用to_json

my_hashes = [
 {"colorName"=>"first", "hexValue"=>"#f00"}, 
 {"colorName"=>"green", "hexValue"=>"#0f0"}, 
 {"colorName"=>"blue", "hexValue"=>"#00f"}, 
 {"colorName"=>"cyan", "hexValue"=>"#0ff"}, 
 {"colorName"=>"magenta", "hexValue"=>"#f0f"}, 
 {"colorName"=>"yellow", "hexValue"=>"#ff0"}, 
 {"colorName"=>"black", "hexValue"=>"#000"}
]

require 'json'
my_hashes.to_json
#=> "[{"colorName":"first","hexValue":"#f00"},{"colorName":"green","hexValue":"#0f0"},{"colorName":"blue","hexValue":"#00f"},{"colorName":"cyan","hexValue":"#0ff"},{"colorName":"magenta","hexValue":"#f0f"},{"colorName":"yellow","hexValue":"#ff0"},{"colorName":"black","hexValue":"#000"}]"

答案 1 :(得分:1)

my_hashes=[{"colorName"=>"first", "hexValue"=>"#f00"}]

new_data = my_hashes.to_json.gsub(/\=\>/, ':')

data = Json.parse new_data