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

Swift 4:如何访问服务器响应字典中的数组值?

解决Swift 4中获取服务器响应数组的问题

嘿,我来帮你搞定这个问题!从你给出的print输出能看出来,你拿到的result["top10"]其实是一个Objective-C风格的字典结构(因为服务器返回的JSON用Foundation框架解析后,有时候会变成NSDictionary/NSArray这类OC集合,打印出来就是这种带括号和键值对的格式)。要拿到里面的完整数组,你可以按下面的步骤来:

方法一:直接类型转换(快速简单)

首先,top10对应的值是一个字典,里面的item键才是你要的数组。我们只需要把它转换成Swift的字典和数组类型就行:

// 假设result是服务器返回的[AnyHashable: Any]类型字典
if let top10Dict = result["top10"] as? [String: Any],
   let itemsArray = top10Dict["item"] as? [[String: Any]] {
    // 这里的itemsArray就是你要的完整数组啦
    print("拿到的数组:", itemsArray)
    
    // 要是想遍历数组里的元素,直接循环就行
    for vehicle in itemsArray {
        let brand = vehicle["vehicle_brand"] as? String ?? "未知品牌"
        let count = vehicle["count"] as? Int ?? 0
        print("\(brand) 的数量:\(count)")
    }
}

方法二:用Codable解析(更安全优雅)

Swift 4开始推荐用Codable协议来做JSON解析,强类型的方式能避免很多类型转换的错误,也更易维护:

// 先定义对应数据结构的模型
struct VehicleStats: Codable {
    let count: Int
    let engineSize: String
    let fuelType: String
    let vehicleBrand: String
    let vehicleType: String
    
    // 因为服务器返回的键是带下划线的,这里做个映射
    enum CodingKeys: String, CodingKey {
        case count
        case engineSize = "engine_size"
        case fuelType = "fuel_type"
        case vehicleBrand = "vehicle_brand"
        case vehicleType = "vehicle_type"
    }
}

struct Top10Container: Codable {
    let item: [VehicleStats]
}

// 然后进行解析
if let top10Object = result["top10"],
   let top10Data = try? JSONSerialization.data(withJSONObject: top10Object),
   let top10Container = try? JSONDecoder().decode(Top10Container.self, from: top10Data) {
    let itemsArray = top10Container.item
    // 这里的itemsArray是[VehicleStats]类型,直接用属性访问就行,不用再强制转换
    for vehicle in itemsArray {
        print("\(vehicle.vehicleBrand) \(vehicle.vehicleType):\(vehicle.count)辆")
    }
}

小提示

你看到的那种奇怪的打印格式,是因为Swift打印OC集合(比如NSDictionary)时会用OC的描述方式,本质还是字典嵌套数组的结构,只要找准层级、做好类型转换就能轻松拿到数据啦~

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

火山引擎 最新活动