2012-10-18 90 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