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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:56:36