2012-02-14 87 views
1

我正在Ruby on Rails中運行程序,並在YAML中設置了一個哈希數組。我得到一個ArgumentError顯然是因爲在前一個散列的右括號中在同一行上有一個大括號。這是什麼錯誤的YAML語法?

例如,我有:

features: [ 
    { 
    name: lorem ipsum, 
    bullets: [ 
     "bullet 1", 
     "bullet 2" 
    ] 
    },{ 
    name: lorem ipsum 2, 
    bullets: [ 
    ... 
    } 
] 

,它給我的錯誤。但是,當我把開口大括號放在一個新的線上,像這樣:

}, 
    { 
    name: lorem ipsum 2, 
    ... 

它工作正常。

我使用Ruby v。1.8.7,Rails v。3.2.1和Rails Config v。0.2.4來讀取YAML文件並在我的應用程序中訪問它。

任何想法如何讓YAML接受我的語法而不用後面的方法呢?

+4

我就在所有工作有點意外;那是非典型的YAML。 – 2012-02-14 23:58:12

+4

看起來像一些邪惡的YAML和JSON混合。 – 2012-02-15 00:03:52

+0

YAML現在是json的超集(請參閱http://yaml.org/spec/1.2) – 2012-02-15 01:04:51

回答

7

YAML不使用大括號,括號等相反,一切都將已經解析爲一個哈希原樣,而你只需要在列表項的前面插入連字符:

features: 
- name: lorem ipsum 
    bullets: 
    - bullet 1 
    - bullet 2 
- name: lorem ipsum 2 
    bullets: 
    - ... 

加載這會給你:

{"features"=>[ 
    { 
    "name"=>"lorem ipsum", 
    "bullets"=>["bullet 1", "bullet 2"] 
    }, 
    { 
    "name"=>"lorem ipsum 2", 
    "bullets"=>["..."] 
    } 
]} 
+0

我明白了。看起來我必須重新格式化我的YAML。謝謝。 – 2012-02-15 22:16:22

+1

根據目前的[YAML規範](http://yaml.org/spec/1.0/#id2489726),YAML確實有大括號和括號。 – Praxeolitic 2015-12-07 18:04:55

3

Ruby 1.8中使用SYCK庫來解析YAML,只實現了YAML規範1.0版本(也沒有維護等)。

使用支持yaml規範1.1版本的更新的YAML解析器(例如psych,可在Ruby 1.9中使用)解析。只要做到

require 'psych' 
require 'yaml' 

,以確保您使用的迷幻(檢查YAML::ENGINE值)。看起來像心理是可用的紅寶石1.8雖然

然而,它是有點不尋常的看yaml,至少在紅寶石世界 - 迪倫的重新格式化它更常見。 根據spec yaml這幾天實際上是JSON的超集(它已經通過了我!)

+0

有趣。我會在哪裏放置這些線並檢查YAML :: ENGINE的值? – 2012-02-15 22:16:06

+0

Bundler實際上是爲你做的,所以當你升級到1.9(並且只要你的機器安裝了libyaml),這應該會爲你調用。檢查YAML :: ENGINE只是爲了排除其他重置您選擇的YAML引擎的任何內容(例如,延遲作業版本<3.0)。我只是從軌道控制檯檢查。 – 2012-02-16 09:47:16

2

這個問題中的YAML不是慣用的,但它實際上是非常接近合法的。 YAML需要在列表中的逗號這是上線後失蹤的空間8

修正YAML:

features: [ 
    { 
    name: lorem ipsum, 
    bullets: [ 
     "bullet 1", 
     "bullet 2" 
    ] 
    }, { 
    name: lorem ipsum 2, 
    bullets: [] 
    } 
]