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

