访问JSON API嵌套数据报错:无法将String隐式转换为Integer
解决FPL API获取所有
first_name数据的错误问题 你遇到的no implicit conversion of String into Integer错误,核心原因是object["elements"]返回的是数组类型(包含多个球员对象的集合),而非单个哈希对象。数组仅支持整数索引访问元素,直接使用字符串"first_name"作为索引,会触发类型转换错误。
修正后的代码
通过遍历数组提取每个元素的first_name即可解决问题,推荐使用map方法实现:
def index require 'net/http' require 'json' url = 'https://fantasy.premierleague.com/api/bootstrap-static/' uri = URI(url) response = Net::HTTP.get(uri) object = JSON.parse(response) # 遍历elements数组,提取每个球员的first_name @testy = object["elements"].map { |player| player["first_name"] } end
扩展用法示例
如果需要同时获取球员全名,可扩展逻辑如下:
@players_full_names = object["elements"].map do |player| "#{player["first_name"]} #{player["second_name"]}" end
额外优化建议
- 避免在控制器方法内使用
require,建议将require 'net/http'和require 'json'放在文件最顶部。 - 添加基础错误处理,防止网络请求或解析失败导致崩溃:
def index require 'net/http' require 'json' url = 'https://fantasy.premierleague.com/api/bootstrap-static/' uri = URI(url) begin response = Net::HTTP.get(uri) object = JSON.parse(response) @testy = object["elements"].map { |player| player["first_name"] } rescue Net::OpenTimeout, JSON::ParserError => e @testy = [] Rails.logger.error "FPL数据获取失败: #{e.message}" end end
内容的提问来源于stack exchange,提问作者ldthompson
相关产品推荐
相关产品推荐

