如何将yaml文件解析为Ruby的哈希和/或数组?

41

我需要将一个yaml文件加载到哈希表中,应该怎么做?


4
请更新您所选择的答案。您选择的答案并没有回答您实际的问题(无论它是否更加详细),请确保翻译时不改变原意。 - Volte
4个回答

117

我会使用类似以下的代码:

hash = YAML.load(File.read("file_path"))

1
在 Ruby 2.2 中,符号也会被垃圾回收。 - Kris

27

venables的回答的简化版本:

hash = YAML.load_file("file_path")

12

使用YAML模块:
http://ruby-doc.org/stdlib-1.9.3/libdoc/yaml/rdoc/YAML.html

node = YAML::parse( <<EOY )
one: 1
two: 2
EOY

puts node.type_id
# prints: 'map'

p node.value['one']
# prints key and value nodes: 
#   [ #<YAML::YamlNode:0x8220278 @type_id="str", @value="one", @kind="scalar">, 
#     #<YAML::YamlNode:0x821fcd8 @type_id="int", @value="1", @kind="scalar"> ]'

# Mappings can also be accessed for just the value by accessing as a Hash directly
p node['one']
# prints: #<YAML::YamlNode:0x821fcd8 @type_id="int", @value="1", @kind="scalar"> 

http://yaml4r.sourceforge.net/doc/page/parsing_yaml_documents.htm


9
通常情况下,它返回Syck :: Map(或类似的对象),而不是散列。是否有任何方法可以使其返回(或转换为)普通的Ruby哈希表? - elsurudo

5
您可能会遇到一个问题,就像这个相关问题中提到的那样,即YAML文件或流指定了一个对象,YAML加载器将尝试将数据转换为该对象。问题是您需要一个相关的Gem,该Gem知道所涉及的对象。
我的解决方案非常简单,并作为该问题的答案提供。做这个:
yamltext = File.read("somefile","r")
yamltext.sub!(/^--- \!.*$/,'---')
hash = YAML.load(yamltext)

实质上,你需要从yaml文本中剥离物体分类器文本,然后解析/加载它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接