Ошибка обработки «JSON.parse» неверный / не JSON формат - PullRequest
0 голосов
/ 12 июня 2018

Я запрашиваю информацию из службы потоковой передачи HTTP.Он предоставляет данные в формате JSON.Вот документация .Вот часть кода, который я использую:

require 'uri'
require 'net/https'
require 'json'


uri = URI("https://api.tradier.com/v1/markets/events/session")
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.request_uri)
http.read_timeout = 30
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER

# Headers

request["Accept"] = "application/json"
request["Authorization"] = "Bearer xxx"

# Send synchronously

response = http.request(request)

# parses response

parse = JSON.parse(response.body)

#out puts values only from response

sessionid = parse.values[0]["sessionid"]
url = parse.values[0]["url"]


uri = URI("#{url}?sessionid=#{sessionid}&symbols=aapl")
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.request_uri)
http.read_timeout = 30
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER

# Headers

request["Accept"] = "application/json"
request["Authorization"] = "Bearer xxx"


http.request request do |response|
  response.read_body do |data|
    puts data.class
  #  info = JSON.parse(data, :quirks_mode => true)
  #  puts info.values
    end
end

Я хочу, чтобы система продолжила программу.Кажется, мне нужно использовать begin и rescue, но я не могу заставить их работать.Когда я запрашиваю данные, я получаю следующую ошибку:

`parse ': 757: неожиданный токен в' {" type ":" trade "," symbol ":" AAPL "," exch ": "Q", "цена": "191,23", "размер": "1081622", "cvol": "18308460", "дата": "1528747200000", "последний": "191,23"} { "тип":"Резюме", "символ": "AAPL", "открыть": "191,35", "высокий": "191,97", "низкий": "190,21", "prevClose": "191,7", "закрыть": "191,23"} '(JSON :: ParserError)

1 Ответ

0 голосов
/ 12 июня 2018

Конечная точка, которую вы используете, задокументирована в Документах Tradier API , и это потоковая конечная точка .

Похоже, что ответ не разделен на части, чтобы содержать только одинДокумент JSON на чанк.Однако кажется, что документы разделены переводами строк, поэтому ответ выглядит следующим образом:

{ "json": "data" }
{ "more": "data" }

И это недопустимый JSON.Вероятно, вам нужно проанализировать их один за другим, выполнив что-то вроде:

http.request request do |response|
  response.read_body do |data|
    data.each_line do |chunk|
      info = JSON.parse(chunk)
      puts info.inspect
    end
  end
end

Если разбиение ответа происходит в середине документов JSON, вы должны использовать какое-то буферизованное средство чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...