2

我有一个 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\"]

我究竟做错了什么?

4

1 回答 1

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 

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

于 2012-10-18T08:59:12.357 回答