Ruby:带有转义反斜杠的JSON.parse

时间:2012-10-18 08:22:43

标签: ruby json escaping

我有一个JSON编码的数组,看起来像这样(注意:这是在一个文件中,而不是字符串的内容):["Company\\","NN","Company\\"]。这是无效的JSON吗?它包含一个转义的\字符,看起来对我而言。但是:

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\"]

我做错了什么?

1 个答案:

答案 0 :(得分: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 

那么,你做错了什么?从数据文件切割和粘贴到源代码中。 :)