【问题标题】:Why isn't my yaml being parsed correctly?为什么我的 yaml 没有被正确解析?
【发布时间】:2011-08-19 21:28:53
【问题描述】:

有谁知道为什么这个 yaml 会被我的应用正确解析和读取

  development:
    autocreate_indexes: false
    allow_dynamic_fields: true
    include_root_in_json: false
    parameterize_keys: true
    persist_in_safe_mode: false
    raise_not_found_error: true
    reconnect_time: 3
    uri: mongodb://app:app@flame.mongohq.com:27076/app1

但是这个 yaml 不是

defaults: &defaults
  autocreate_indexes: false
  allow_dynamic_fields: true
  include_root_in_json: false
  parameterize_keys: true
  persist_in_safe_mode: false
  raise_not_found_error: true
  reconnect_time: 3

development:
  <<: *defaults
  uri: mongodb://app:app@flame.mongohq.com:27076/app1

我过去曾多次遇到此问题,并且将删除快捷方式语法作为解决方法,但这次我正在使用一个大型应用程序,它在所有地方都使用这种语法,所以我不能轻松转换。

我从来没有遇到过 yaml 解析错误,只是稍后在找不到应用所依赖的值时,我会在调用堆栈中遇到各种错误。

我的环境:

ubuntu 11.04

python 2.7.1+

rvm下的ruby 1.9.2-p180

如果您还需要解决此问题,请告诉我。

更新

当我删除此文件上的速记语法时,我会遇到下一个错误:

psych.rb:148:in `parse': couldn't parse YAML at line 7 column 19 (Psych::SyntaxError)

https://gist.github.com/958472

【问题讨论】:

  • 也许您不能对节点和引用使用相同的名称 (defaults: &amp;defaults)?
  • 这只是一个高级配置文件。依赖 gem 中还有很多其他地方可以做同样的事情。
  • 它在 Ruby 1.8.7 中似乎可以正常工作。您能否将错误解析的数据结构添加到您的问题中?如果可能,使用 'pp' 打印。

标签: python ruby yaml


【解决方案1】:

PyYAML 似乎解析得很好:

>>> yaml.load(s)
<<< 
{'defaults': {'allow_dynamic_fields': True,
              'autocreate_indexes': False,
              'include_root_in_json': False,
              'parameterize_keys': True,
              'persist_in_safe_mode': False,
              'raise_not_found_error': True},
 'development': {'allow_dynamic_fields': True,
                 'autocreate_indexes': False,
                 'include_root_in_json': False,
                 'parameterize_keys': True,
                 'persist_in_safe_mode': False,
                 'raise_not_found_error': True,
                 'uri': 'mongodb://app:app@flame.mongohq.com:27076/app1'},
 'e': 3}

您没有指定加载 yaml 的位置/方式,但如果您无法解析它,您或许可以使用 PyYAML 转换您的配置文件:

with open('converted.yaml', 'w') as f:
    f.write(yaml.dump(yaml.load(s)))

【讨论】:

    【解决方案2】:

    解决方案是将以下内容添加到我的 boot.rb

    require 'yaml'
    YAML::ENGINE.yamler= 'syck'
    

    【讨论】:

      猜你喜欢
      • 2010-11-14
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多