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
相关产品推荐
相关产品推荐

