2012-10-18 88 views
2

我有一个JSON编码数组看起来像这样(注:这是一个文件,一个字符串的不是内容):["Company\\","NN","Company\\"]。这是无效的JSON?它包含一个逃脱的\角色,看起来很适合我。但是:红宝石:JSON.parse与逃脱反斜杠

a = '["Company\\","NN","Company\\"]' 
=> "[\"Company\\\",\"NN\",\"Company\\\"]" 
JSON.parse a 
JSON::ParserError: 387: unexpected token at 'NN","Company\"]' 
from /Users/nneubauer/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/json/common.rb:148:in `parse' 
from /Users/nneubauer/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/json/common.rb:148:in `parse' 
from (irb):11 
from /Users/nneubauer/.rvm/rubies/ruby-1.9.3-p0/bin/irb:16:in `<main>' 

有趣的是:

puts a 
["Company\","NN","Company\"] 

我在做什么错?

回答

5

我认为有阅读的字节序列是从一个文件,并把它在你的Ruby代码从字面上之间的差异。

当您使用'作为Ruby代码中的字符串分隔符时,它仍然将\\解释为转义序列。所以你得到一个值为["Company\","NN","Company\"]的字符串。

然后JSON解析器得到它。它会看到起始[,然后查找字符串。它解释\"序列为转义,所以它看到的第一串具有的Company\",的值。然后,它希望看到一个逗号 - 但他认为NN代替,并抛出了起来:

1.9.3-p194 :009 > a = '["Company\\","NN","Company\\"]' 
=> "[\"Company\\\",\"NN\",\"Company\\\"]" 
1.9.3-p194 :010 > puts a 
["Company\","NN","Company\"] 
=> nil 
1.9.3-p194 :011 > JSON.parse(a) 
JSON::ParserError: 387: unexpected token at 'NN","Company\"]' 

但如果我使用gets文件读取字节序列,则该值最终被["Company\\","NN","Company\\"]。这可以被解析为JSON - 所述\\由JSON解释,那么它看到"和正确地关闭所述阵列中的第一字符串。

1.9.3-p194 :012 > b = gets 
["Company\\","NN","Company\\"] 
=> "[\"Company\\\\\",\"NN\",\"Company\\\\\"]\n" 
1.9.3-p194 :013 > puts b 
["Company\\","NN","Company\\"] 
=> nil 
1.9.3-p194 :014 > JSON.parse b 
=> ["Company\\", "NN", "Company\\"] 
1.9.3-p194 :015 > JSON.parse(b).length 
=> 3 

那么,你在做什么错?将数据文件剪切并粘贴到源代码中。 :)

+0

嗯,其实我是从一个文件读这篇文章,只是想调试的问题,但没想到使用'gets'输入的。感谢您的快速回复! – Nicolas