2013-10-11 76 views
5

Ruby 2.0,Yaml使用Psych似乎无法逃避双引号。任何人有解决这个问题的想法?YAML:错误解析字符串与逃脱的双引号

data_ =<<END_ 
description: "Acme acquires ILM: Lucas says \"Inevitable!\"" 
END_ 

ap YAML.load(data_) 

产生

/Users/x/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych.rb:205:in `parse': (<unknown>): did not find expected key while parsing a block mapping at line 1 column 1 (Psych::SyntaxError)  

逃逸单引号的进入工作,但如果它包含单引号,逃避他们产生错误了。

description: 'Acme acquires ILM: Lucas says "It\'s Inevitable!"' 

在一个理想的世界,这些条目应该包含适当的Unicode印刷报价,但我没有控制这些(虽然我可以用YAML处理之前取代他们)......

任何想法有没有YAML正确解析这个?

更新:回答我的问题。发现,可以通过复制其逃脱单引号,所以此工程:

description: 'Acme acquires ILM: Lucas says "It''s Inevitable!"' 

我用YAML.dump(在期望的字符串)发现了这个

回答

7

您的问题是here文档就逃避而言,就像双引号字符串一样行事。这意味着您的heredoc中的\"最终只会在您的字符串中显示为"。注意:

>> data_ =<<END_ 
description: "Acme acquires ILM: Lucas says \"Inevitable!\"" 
END_ 
>> puts data_ 
description: "Acme acquires ILM: Lucas says "Inevitable!"" 

你想获得一个\到YAML字符串,所以你必须要逃避它:

data_ =<<END_ 
description: "Acme acquires ILM: Lucas says \\"Inevitable!\\"" 
END_ 

或者,使用%q{...}引用您的字符串,使其更像一个单引号字符串:

data_ = %q{ 
description: "Acme acquires ILM: Lucas says \"Inevitable!\"" 
} 
+0

A-ha!所以我看着错误的地方。谢谢! – aaandre

+0

我可能会根据Ruby对象构建所需的结构,然后用'to_yaml'来获取字符串,而不用引用无意义的方式来担心这种方式。 –