由于不可见的字符,无法解析JSON

时间:2014-10-16 07:36:47

标签: ruby 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>'

我很确定这是因为看不见的字符,但stripdelete!("\r")没有帮助。

cat -e a.json

{ "k": "v" }%  

cat -e b.json

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

1 个答案:

答案 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"}