使用JSONSerialization.jsonObject()解析JSON返回nil的问题排查
问题分析与解决方案
你的JSON解析返回nil主要有两个关键问题,咱们一个个拆解:
1. 解析类型不匹配
你拿到的JSON根结构是数组(开头是[,结尾是]),但你尝试把它强转为[String: AnyObject]——这是字典类型,和数组完全不匹配,所以解析后自然返回nil。
2. 原始字符串包含多余的外层引号
从你提供的内容看,获取到的字符串是被外层双引号包裹的(比如开头是"[{...}]"),这种格式本身不是有效的JSON数组(有效的JSON数组应该直接以[开头),JSONSerialization无法识别这种带外层引号的结构,也会导致解析失败。
修正后的代码示例
// 1. 先把数据转成字符串,去除外层的双引号 guard let string = String(data: data, encoding: .utf8) else { print("无法将数据转为字符串") return } let cleanedString = string.trimmingCharacters(in: CharacterSet(charactersIn: "\"")) // 2. 把清理后的字符串转回Data guard let cleanedData = cleanedString.data(using: .utf8) else { print("无法将清理后的字符串转回Data") return } // 3. 解析为数组类型([[String: Any]] 比 AnyObject 更推荐在Swift中使用) do { if let jsonArray = try JSONSerialization.jsonObject(with: cleanedData) as? [[String: Any]] { print("解析成功:\(jsonArray)") // 这里可以遍历数组处理每个好友对象 for friendItem in jsonArray { let name = friendItem["name"] as? String let friendUser = friendItem["friend_user"] as? [String: Any] let friendEmail = friendUser?["email"] as? String print("好友姓名:\(name ?? "未知"),邮箱:\(friendEmail ?? "未知")") } } else { print("解析后的类型不是数组") } } catch { print("解析失败,错误信息:\(error.localizedDescription)") }
额外提示
如果你的HTTP请求返回的原始数据就带外层引号,可能是后端返回格式有问题——正常的JSON响应应该直接返回数组,不需要额外包裹引号。如果可以的话,建议和后端同学确认下返回格式,这样前端可以省去清理字符串的步骤,直接解析原始数据。
内容的提问来源于stack exchange,提问作者user616076
相关产品推荐
相关产品推荐

