为什么我的yaml没有被正确解析?

2 投票
2 回答
573 浏览
提问于 2025-04-16 17:06

有没有人知道为什么我这个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+

ruby 1.9.2-p180,使用rvm

如果你需要其他信息来解决这个问题,请告诉我。

更新

当我把这个文件里的简写语法去掉后,我遇到了下一个错误:

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

https://gist.github.com/958472

2 个回答

0

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)))
1

解决办法是在我的 boot.rb 文件中添加以下内容

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

撰写回答