Недавно я столкнулся с проблемой разбора ответов JSON, содержащих html-инъекции.
[{"Date":"\/Date(1316445326553+0400)\/",
"Dishes":null,"Id":103,"Name":"Menutka уже с Вами!",
"PictureId":130144,
"TextHtml":"<!DOCTYPE html PUBLIC '-\/\/W3C\/\/DTD XHTML 1.0 Transitional\/\/EN' 'http:\/\/www.w3.org\/TR\/xhtml1\/DTD\/xhtml1-transitional.dtd'>\u000a<html xmlns='http:\/\/www.w3.org\/1999\/xhtml'>\u000a<head>\u000a... etc",
"Type":1,"UserId":1,"UserName":"Администратор"}]
и попытался сделать JSON.parse response.body
, где тело ответа - мой JSON. Он тихо подчиняется, но возвращает пустую коллекцию. Я пытался проверить этот JSON на этом сайте и он говорит "Это действительно"
Так что я немного смущен тем, что пошло не так.
PS это мой метод разбора:
def self.get(uri)
raw_url = BASE_URL+uri
url = "#{BASE_URL}"+CGI::escape(uri)
f = File.open('response.log', 'a')
start = Time.new
f.print "#{start.to_s}\t#{uri}"
resp = Net::HTTP.get_response(URI.parse(url))
stop = Time.new
f.puts "\t\t#{stop-start} seconds"
f.close
data = resp.body
begin
if data.blank? or data.include?('<html')
return {}
end
object = JSON.parse(data)
rescue JSON::ParserError
raise Exceptions::NothingReturned, "GET Error on #{raw_url}"
end
end