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

Ruby从嵌套哈希数组提取videoId的方法及问题排查

问题:Ruby中获取JSON嵌套结构里所有videoId的最优方法,原代码为何失效?

我有一个存储在JSON文件中的复杂哈希data,想要获取其中的videoId字段,执行代码puts data["videoId"]后未得到任何结果。请问在Ruby中获取所有videoId的最优方法是什么?原代码为何无法正常工作?

对应的JSON数据如下:

{ "etag": "\"DuHzAJ-eQIiCIp7p4ldoVcVAOeY/2rushbFMdJCgH0PsUecXvdIjrIA\"", "items": [ { "etag": "\"DuHzAJ-eQIiCIp7p4ldoVcVAOeY/SGIvedEKHZeJcInXZg-T4Lde7gE\"", "id": "TExreW5lbzZYQXYxbm8xakgzM0syQm1nLnhTWTc1cUpfa0lr", "kind": "youtube#playlistItem", "snippet": { "publishedAt": "2018-05-21T16:00:00.000+00:00", "resourceId": { "kind": "youtube#video", "videoId": "xSY75qJ_kIk" }, "title": "The Key (Wax Trax Mix) - Space Bunny | Surreal [1998]" } }, { "etag": "\"DuHzAJ-eQIiCIp7p4ldoVcVAOeY/Z7hQMBr8AzIyI7n2LPBnd7AUwjs\"", "id": "TExreW5lbzZYQXYxbm8xakgzM0syQm1nLmVISWd4c2EzckVz", "kind": "youtube#playlistItem", "snippet": { "publishedAt": "2018-05-18T08:00:00.000+00:00", "resourceId": { "kind": "youtube#video", "videoId": "eHIgxsa3rEs" }, "title": "Coin coin Pata'tribe mix [Old School Tekno Tribe]" } }, { "etag": "\"DuHzAJ-eQIiCIp7p4ldoVcVAOeY/T2xQFVjUHZYJ2FHGa4Yb82yMubc\"", "id": "TExreW5lbzZYQXYxbm8xakgzM0syQm1nLmgxMFlVSVVxb1lN", "kind": "youtube#playlistItem", "snippet": { "publishedAt": "2018-05-17T16:00:00.000+00:00", "resourceId": { "kind": "youtube#video", "videoId": "h10YUIUqoYM" }, "title": "Lil Louis 1992.09.25 @ Hacienda" } } ] }

解答

原代码失效的原因

你执行的puts data["videoId"]没有返回结果,核心原因是**videoId并不是顶层哈希的直接键**。看你提供的JSON结构,videoId嵌套在items数组里的每个元素中,路径是item -> snippet -> resourceId -> videoId。顶层哈希只有etag和items两个键,直接访问data["videoId"]自然会返回nil,所以没有输出。

获取所有videoId的最优方法

根据你的场景,我整理了几种实用且高效的方式:

方法1:直接用map遍历(最直观)

如果能确保所有item都有完整的嵌套结构,直接遍历items数组逐层取值即可:

# 假设data已经是解析后的Ruby哈希
video_ids = data["items"].map do |item|
  item["snippet"]["resourceId"]["videoId"]
end

puts video_ids
# 输出:["xSY75qJ_kIk", "eHIgxsa3rEs", "h10YUIUqoYM"]

方法2:用dig处理可能的键缺失(更安全)

如果你的JSON数据可能存在部分item缺少snippet、resourceId或videoId的情况,用dig可以避免抛出NoMethodError,最后用compact过滤掉nil值:

video_ids = data["items"].map do |item|
  item.dig("snippet", "resourceId", "videoId")
end.compact

puts video_ids

dig会逐层查找指定键,只要中间某一层不存在就直接返回nil,非常适合处理不可靠的嵌套数据。

方法3:额外提示——解析JSON文件的正确步骤

如果你还没把JSON文件转换成Ruby哈希,别忘了先执行这一步:

require 'json'

# 读取并解析JSON文件
data = JSON.parse(File.read("your_json_file.json"))

内容的提问来源于stack exchange,提问作者Dede Banell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:05:02