iOS端解析服务器响应中的字符串数组遇到问题
排查JSON解析异常的实用步骤
看起来你在解析API返回的JSON时遇到了类型转换问题,我来帮你一步步定位和解决:
首先,你给出的响应是Objective-C对象的打印结果(比如<__NSArrayI>这种),不是原始JSON字符串,很容易误导判断。建议先打印原始响应数据,搞清楚真实的JSON结构:
if httpResponse.statusCode == 200 { print("SUCCESS!") // 先打印原始JSON字符串,确认真实结构 if let responseData = response.data, let rawJSON = String(data: responseData, encoding: .utf8) { print("原始JSON内容:\n\(rawJSON)") } // 再尝试解析,同时增加错误日志 if let result = response.result.value as? [String: Any] { print("顶层字典解析成功") // 检查products字段的实际类型 let productsValue = result["products"] print("products字段的实际类型:\(type(of: productsValue))") guard let products = productsValue as? [[String: Any]] else { print("⚠️ 无法将products转换为[[String:Any]]类型") return } print("成功解析到\(products.count)个商品") // 这里写后续的商品处理逻辑 } else { print("⚠️ 无法将响应结果转换为[String:Any]类型") print("响应结果的实际类型:\(type(of: response.result.value))") } }
常见问题及对应解决方法
1. 顶层结构不是字典,而是数组
如果原始JSON的顶层是数组(比如[{"products": [...]}, ...]),那第一步把响应转成[String:Any]就会失败。这时候要改成解析数组:
if let resultArray = response.result.value as? [[String: Any]] { for item in resultArray { if let products = item["products"] as? [[String: Any]] { // 处理商品数组 } } }
2. products是单个对象,不是数组
如果API返回的products是单个商品对象(比如{"products": {"barcode": "HDz", ...}}),那转成数组肯定失败,要改成解析单个字典:
guard let singleProduct = result["products"] as? [String: Any] else { print("products是单个商品对象,不是数组") return } // 处理单个商品
3. category_json是嵌套的JSON字符串
注意到响应里的category_json是字符串格式的JSON(比如"[{\"category_name\":\"Home\",\"category_id\":\"2\"}]"),如果之后要解析这个字段,得做二次解析:
// 假设已经拿到products数组 for product in products { if let categoryJSONStr = product["category_json"] as? String, let categoryData = categoryJSONStr.data(using: .utf8) { do { let categories = try JSONSerialization.jsonObject(with: categoryData) as? [[String: Any]] print("当前商品的分类:\(categories ?? [])") } catch { print("解析category_json失败:\(error.localizedDescription)") } } }
4. 可选值处理遗漏
确保response.result.value不是nil,并且httpResponse是有效的。上面的代码里已经增加了类型打印,能帮你快速定位哪一步的类型不符合预期。
内容的提问来源于stack exchange,提问作者user8977455




