2014-10-16 2 views
2

я получаю ошибку с этим кодом:Невозможно разобрать JSON из-за невидимых символов

require 'net/http' 
require 'rubygems' 
require 'json' 

puts "test1:" 
url = "http://thomas.joulin.eu/a.json" 
resp = Net::HTTP.get_response(URI.parse(url)) 
data = resp.body 
result = JSON.parse(data) 
puts result 

puts "test2:" 
url = "http://thomas.joulin.eu/b.json" 
resp = Net::HTTP.get_response(URI.parse(url)) 
data = resp.body 
result = JSON.parse(data) 
puts result 

Ответ:

test1: 
{"k"=>"v"} 
test2: 
(JSON::ParserError).0.0/gems/json-1.8.1/lib/json/common.rb:155:in `parse': 757: unexpected token at '{ "k": "v" } 
' 
    from /Library/Ruby/Gems/2.0.0/gems/json-1.8.1/lib/json/common.rb:155:in `parse' 
    from test.rb:16:in `<main>' 

Я уверен, что это из-за невидимых chacters, но strip или delete!("\r") не помогло.

cat -e a.json

{ "k": "v" }% 

cat -e b.json

{ "k": "v" }^M$ 

ответ

4

Проблема не caracters в конце содержания, но в самом начале:

[82] pry(main)> data 
=> "\xEF\xBB\xBF{ \"k\": \"v\" }\r\n" 

The \ XEF \ Xbb \ XBF

Это маска порядок UTF-8 байт (http://en.wikipedia.org/wiki/Byte_order_mark)

Если вы уверены, что обычный ASCII I, вы можете сделать следующее:

JSON.parse data.encode("ASCII",{:undef=>:replace,:replace=>""}) 
=> {"k"=>"v"} 

Другой вариант заключается в замене конкретных символов BOM:

JSON.parse data.encode("UTF-8").gsub!("\xEF\xBB\xBF".force_encoding("UTF-8"), '') 
=> {"k"=>"v"} 
+0

Я ожидаю, что латинские символы, такие как "é" или "N", так что я использовал свой второй вариант, работает отлично: 'данные = resp.body.force_encoding ("UTF-8") данных .gsub! ("\ XEF \ Xbb \ XBF ".force_encoding (" UTF-8 "), '')' –

+0

Спасибо. Это касается и моей проблемы. – MKumar

Смежные вопросы