【问题标题】:'JSON.parse' error handling invalid/non JSON format'JSON.parse' 错误处理无效/非 JSON 格式
【发布时间】:2018-06-12 15:24:07
【问题描述】:

我从 HTTP 流服务请求信息。它以 JSON 格式提供数据。这里是the documentation。这是我正在使用的代码的一部分:

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

我想让系统继续执行该程序。看来我需要使用beginrescue,但我无法让它们工作。当我请求数据时,我收到以下错误:

`parse': 757: '{"type":"trade","symbol":"AAPL","exch":"Q","price":"191.23","size": "1081622","cvol":"18308460","date":"1528747200000","last":"191.23"}{"type":"summary","symbol":"AAPL","open":" 191.35","high":"191.97","low":"190.21","prevClose":"191.7","close":"191.23"}' (JSON::ParserError)

【问题讨论】:

  • 请分享您如何构建请求以及响应的值是什么。
  • 取决于您的库,它可能已经将 JSON 解析为哈希;在info = JSON... 之前做一个puts data.class 并检查一下
  • 嘿乔希,我继续做了,它吐出了“字符串”
  • 我已经添加了整个脚本。我首先必须获得一个会话 ID,然后使用它来打开字符串。
  • 你能发布实际产生错误的数据字符串吗?或者它是黄色引号中 ' ' 之间的完整字符串?在那种情况下,似乎有一个奇怪的}{

标签: ruby


【解决方案1】:

您使用的端点记录在Tradier API docs 中,它是streaming endpoint

似乎响应没有分块,每个块只包含一个 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 文档的中间,则必须使用某种缓冲阅读器。

【讨论】:

  • 感谢您提供此信息。我尝试了这个解决方案,但它仍然对我产生错误。
猜你喜欢
  • 2023-02-08
  • 1970-01-01
  • 2021-08-31
  • 2015-01-20
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
相关资源
最近更新 更多