You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby 3.0.4调用API报809 unexpected token JSON解析错误求助

错误根因

你对报错位置的理解存在偏差:报错提示的位置809,是业务API(v2/astrology/thirumana-porutham/advanced接口)返回响应体的第809位,不是已生成的token.json文件的内容位置。
你的代码中parseResponse方法被复用来解析两类接口的返回:

  • 调用token接口生成访问凭证时,接口返回合法JSON,因此token可以正常生成并写入token.json,这一步没有问题。
  • 报错发生在后续请求业务接口、解析响应的环节:你发起GET请求时没有开启SSL配置,默认走HTTP明文协议发送请求,但目标API强制使用HTTPS协议,HTTP请求拿到的不是预期的JSON格式返回,通常是跳转提示HTML、错误页甚至空响应。JSON解析器处理这类非JSON内容时,在第809位碰到不符合JSON语法规则的字符,就会抛出解析错误。
修复步骤
  1. 修改get方法中的HTTP请求配置,启用SSL,修正后的代码段如下:
    res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
      http.request(req)
    end
    
  2. 在parseResponse方法最开头增加HTTP状态校验,避免非预期返回直接触发JSON解析错误,增加排查成本,参考代码如下:
    def parseResponse(response)
      content = response.body
      unless response.is_a?(Net::HTTPSuccess)
        raise "HTTP请求异常,状态码:#{response.code},返回内容:#{content}"
      end
      res = JSON.parse(content)
    
      # 原有逻辑保持不变
      if res.key?('access_token')
          return res
      end
    
      if res['status'] == "error"
          raise ApiError, res['errors'].map {|e| e['detail']}.join("\n")
      end
    
      if res['status'] != "ok"
          raise "HTTP request failed"
      end
    
      return res
    end
    
  3. 在test.rb文件最开头补充引入client.rb的代码,避免运行时找不到ApiClient类:
    require_relative 'client'
    
报错逻辑说明

Ruby JSON解析器抛出的unexpected token at ''错误中,单引号包裹的内容是解析器碰到非法字符后,剩余无法识别的内容片段。你这里该片段为空,说明解析器读到第809位时直接碰到了响应内容的结束标记,本质是传入JSON.parse的字符串不是完整、合法的JSON结构。你之前排查token内容的809位属于找错了排查对象——token接口的解析流程已经正常执行完成,报错出现在后续业务接口的响应解析环节。

内容的提问来源于stack exchange,提问作者radhika iyer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 02:54:37