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

Xcode 9.2+Swift4下如何判断JSON数据是否为null?解决下标报错

解决Swift 4中JSON解析的"Type 'Any' has no subscript members"错误

嘿,咱们先把问题根源揪出来:你返回的JSON根结构是字典(外层是{}),但你却把它强制转换成了NSMutableArray,这不仅是类型不匹配,还直接导致后续访问json[0]["data"]时出错——因为数组元素是Any类型,Swift无法确定它是字典,自然不让你用下标访问!

接下来一步步给你修正代码:

步骤1:修正JSON解析的类型

把json的类型从NSMutableArray换成Swift原生的[String: Any](字典类型),同时抛弃不安全的try!,用guard let做安全校验:

步骤2:安全判断"data"是否为null

我们需要先取出"data"字段,确认它既不是NSNull,又是合法的数组类型,再进行后续处理。

完整修正后的代码

var newsArray: [[String: Any]] = [] // 用Swift原生数组替代NSMutableArray
let urlFactory = URLFactory()

do {
    guard let url = urlFactory.getURL(),
          let data = try? Data(contentsOf: url) else {
        // 处理URL无效或数据获取失败的情况
        print("Failed to get valid URL or data")
        return
    }
    
    // 解析JSON为字典类型,避免强制转换崩溃
    guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else {
        print("JSON format is invalid")
        return
    }
    
    // 检查data字段:既不是null,又是非空数组
    if let newsData = json["data"] as? [[String: Any]], !newsData.isEmpty {
        // data存在且有效,处理你的新闻数据
        newsArray = newsData
        print("Successfully loaded \(newsArray.count) news items")
    } else {
        // data是null或者空数组
        print("Data is null or empty")
    }
    
} catch let error {
    print("Error parsing JSON: \(error.localizedDescription)")
}

额外优化建议

  • 尽量用Swift原生集合类型(Array、Dictionary)替代NSMutableArray这类OC集合,类型更安全,也符合Swift编码习惯。
  • 绝对避免try!和as!这类强制操作,一旦JSON格式不符合预期,App会直接崩溃,guard let/if let才是安全的选择。
  • 如果你的JSON结构固定,推荐用Swift 4+的Codable协议解析,定义对应的数据模型后,用JSONDecoder就能一键解析,代码更简洁易维护。

内容的提问来源于stack exchange,提问作者Jumana Alhaddad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:37:41