我的代码出错:
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>'
我很确定这是因为看不见的字符,但strip
或delete!("\r")
没有帮助。
cat -e a.json
{ "k": "v" }%
cat -e b.json
{ "k": "v" }^M$
答案 0 :(得分:5)
问题不在内容的末尾,而是在开头:
[82] pry(main)> data
=> "\xEF\xBB\xBF{ \"k\": \"v\" }\r\n"
\ xEF \ xBB \ xBF
这是UTF-8字节顺序掩码(http://en.wikipedia.org/wiki/Byte_order_mark)
如果您确定我是纯ASCII,您可以执行以下操作:
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"}