Ruby中使用.dig查询嵌套哈希值返回空值问题排查
问题分析与解决方案
首先,dig方法本身确实是处理嵌套哈希的实用工具,但你的用法没匹配Reddit返回的JSON结构,这才是输出为空的核心原因。
我们先拆解下Reddit返回的数据结构:
- 最外层是一个哈希,核心数据都包裹在
"data"键下 "data"里的"children"是数组,每个元素对应一条独立评论- 每条评论的正文(
body),存放在该元素的"data"子哈希中
你的原代码json.dig("children","data","body")有两个关键错误:
- 根哈希里没有直接的
"children"键,它藏在"data"层级下面 "children"是数组而非哈希,无法直接通过dig取后续键,必须遍历数组中的每个元素
修正后的代码
require 'net/http' require 'json' url = 'https://www.reddit.com/r/programming/comments.json?sort=top&t=all&limit=10' uri = URI(url) response = Net::HTTP.get(uri) json = JSON.parse(response) # 先定位到评论数组:从根data中取出children列表 comments_array = json.dig("data", "children") # 遍历每条评论,提取并输出正文内容 comments_array.each do |comment_item| comment_body = comment_item.dig("data", "body") # 过滤空内容,只打印存在的评论正文 puts comment_body if comment_body end
为什么这样可行?
json.dig("data", "children")正确定位到评论数组,dig的优势是安全嵌套取值——如果某个层级不存在,会返回nil而非抛出异常,避免程序崩溃- 遍历数组中的每个
comment_item,再用dig("data", "body")精准取出单条评论的正文 - 增加
if comment_body判断,能过滤掉被删除或无正文的异常评论
这样就能逐个输出抓取到的有效评论内容了。
内容的提问来源于stack exchange,提问作者KyKy
相关产品推荐
相关产品推荐

