我有一个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\"]
我做错了什么?
答案 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
那么,你做错了什么?从数据文件切割和粘贴到源代码中。 :)