使用Ruby的json gem解析JSON时,为什么会出现“意外令牌”错误?

时间:2013-01-29 20:57:59

标签: ruby json nokogiri

我正在解析的JSON对象位于http://api.4chan.org/3/catalog.json

这是我的Ruby代码:

['open-uri','nokogiri','json'].each{|g| require g}

json_test = File.open('json_test.JSON','r').read
board_cat_body = Nokogiri::HTML(open('http://api.4chan.org/3/catalog.json'))

puts JSON.parse(board_cat_body)

结果(这很长,所以我把它的一部分拿出来):

C:/Ruby193/lib/ruby/1.9.1/json/common.rb:148:in `parse': 387: unexpected token at '{"no":248019,"sticky":1,"closed":1,"now":"12\/19....

但是,如果我将http://api.4chan.org/3/catalog.json的内容复制并粘贴到本地JSON文件中并从该本地JSON文件解析,则没有问题。

有谁知道我做错了什么?

2 个答案:

答案 0 :(得分:1)

删除Nokogiri电话。 JSON不是HTML。

['open-uri','json'].each{|g| require g}
json = JSON.parse(open('http://api.4chan.org/3/catalog.json').read)
puts json.inspect

答案 1 :(得分:1)

您在board_cat_body中获得的文档不是JSON文档,它是HTML,如您打印它可以看到。所以,我建议用这种方式下载文件:

require 'net/http'
require 'json'

url = URI.parse('http://api.4chan.org/3/catalog.json')
req = Net::HTTP::Get.new(url.path)
res = Net::HTTP.start(url.host, url.port) { |http| http.request(req) }

并解析它:

puts JSON.parse(res.body)