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

Swift遍历AnyHashable字典:HTTP响应JSON数据访问报错如何解决

问题原因

你当前代码没有对JSON解析结果做明确的类型转换,dictionaryMessage["precios"]取出的是无类型的Any对象,直接执行下标访问、遍历操作会触发类型不匹配的错误。
从数据结构来看,precios对应的是字典数组,数组中每个元素是键值对格式的字典。

适配现有写法的修正代码

var dictionaryMessage: [String: Any]?
do {
    if let data = result?.data(using: .utf8) {
        dictionaryMessage = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any]
        if let precios = dictionaryMessage?["precios"] as? [[String: Any]] {
            // 遍历precios数组内的所有字典元素
            for precioItem in precios {
                // 遍历单个字典的所有键值
                for (key, value) in precioItem {
                    print("key: \(key)  value: \(value)")
                }
            }
        }
    }
} catch {
    print("解析错误: \(error.localizedDescription)")
}

更推荐的Codable解析方案

Swift原生的Codable协议可以自动完成类型适配,无需手动做类型判断,代码更安全易维护:

// 定义和JSON结构匹配的模型
struct PriceItem: Codable {
    let id: Int
    let name: String
    let price: Double
    // 其余字段按照实际返回补充即可
}

struct RootResponse: Codable {
    let precios: [PriceItem]
}

// 解析逻辑
do {
    guard let data = result?.data(using: .utf8) else { return }
    let response = try JSONDecoder().decode(RootResponse.self, from: data)
    // 直接使用结构化的解析结果
    for item in response.precios {
        print("id: \(item.id) 名称: \(item.name) 价格: \(item.price)")
    }
} catch {
    print("解析错误: \(error)")
}

内容的提问来源于stack exchange,提问作者Ricardo Guerrero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:15:03