【问题标题】:Using gsub to replace "=>" with ":" in an array of hashes使用 gsub 将哈希数组中的“=>”替换为“:”
【发布时间】:2016-08-10 19:51:10
【问题描述】:

我想我把自己写在一个角落里。基本上,我有一个哈希数组,就像这样。

 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

我需要这些哈希值保持原样,所以即使我将它们转换为介绍字符串,如果我将它们转换回来,它们仍然可以使用“=>”符号。有什么建议吗?

【问题讨论】:

  • 只需使用my_hashes.to_json 将其转换为JSON 字符串。您可能需要先require 'json'
  • 为什么先将哈希转换为 JSON 再转换为 CSV?为什么不直接使用 csv from the standard library 转至 CSV?
  • 这是XY problem。与其转换您需要描述您正在尝试做的事情的哈希值,不如寻找一种更好的方法来完成它。
  • 感谢您的建议。我已经找到了解决问题的方法,现在正在重构代码。

标签: json ruby parsing hash gsub


【解决方案1】:

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

但这并不能解决您的问题:您需要一个 Ruby 哈希的 JSON 表示,只需使用 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"}]"

【讨论】:

  • 是的,你完全正确。希望在使用 JSON 之后我能更明智一些。
【解决方案2】:
my_hashes=[{"colorName"=>"first", "hexValue"=>"#f00"}]

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

data = Json.parse new_data

【讨论】:

  • 你可以通过提供一些解释来改进这个答案,而不仅仅是代码。
  • gsub调用没有用,因为to_json创建的json中没有=>
猜你喜欢
  • 1970-01-01
  • 2012-10-29
  • 2019-10-27
  • 2019-05-23
  • 2012-04-12
  • 2010-12-11
  • 1970-01-01
  • 2017-07-06
  • 2020-12-27
相关资源
最近更新 更多