You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动