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 に答える