如何将yaml文件解析为ruby散列和/或数组?

Cro*_*lio 33 ruby hash parsing yaml ruby-on-rails

我需要将一个yaml文件加载到Hash中,
我该怎么办?

ven*_*les 101

我会使用类似的东西:

hash = YAML.load(File.read("file_path"))
Run Code Online (Sandbox Code Playgroud)


Nul*_*ion 13

使用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"> 
Run Code Online (Sandbox Code Playgroud)

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

  • 这往往会返回Syck :: Map(或类似对象),而不是哈希.有没有办法让它返回(或转换)常规的红宝石哈希? (9认同)

Dun*_*son 12

一个简单版本的venables答案:

hash = YAML.load_file("file_path")
Run Code Online (Sandbox Code Playgroud)


Oth*_*eus 5

您可能会遇到此相关问题中提到的问题,即 YAML 文件或流指定 YAML 加载器将尝试将数据转换为的对象。问题是您需要一个了解相关对象的相关 Gem。

我的解决方案非常简单,是作为该问题的答案提供的。做这个:

yamltext = File.read("somefile","r")
yamltext.sub!(/^--- \!.*$/,'---')
hash = YAML.load(yamltext)
Run Code Online (Sandbox Code Playgroud)

本质上,您从 yaml 文本中剥离对象分类器文本。然后你解析/加载它。