iOS开发:如何在Dictionary中访问数组?
解答:访问JSON中的数组内容
嘿,作为iOS新手完全不用不好意思,这种基础问题太常见了~我来一步步教你怎么从这段JSON里拿到restaurants数组的内容,分两种常用方法给你讲:
方法一:手动解析(适合快速验证)
首先你需要把JSON数据转换成Swift的字典类型,然后提取数组:
// 假设你已经获取到JSON对应的Data对象(比如从网络请求、本地文件读取) if let jsonDictionary = try? JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] { // 从字典中取出restaurants数组,转成[[String: Any]]类型 guard let restaurantsArray = jsonDictionary["restaurants"] as? [[String: Any]] else { print("找不到restaurants数组或者类型不匹配") return } // 现在可以自由操作这个数组了 // 1. 遍历所有餐厅 for restaurant in restaurantsArray { let id = restaurant["id"] as? Int ?? 0 let name = restaurant["restaurantName"] as? String ?? "未知餐厅" let status = restaurant["status"] as? String ?? "状态未知" print("ID: \(id),名称:\(name),状态:\(status)") } // 2. 按索引访问特定餐厅(比如第一个) if let firstRestaurant = restaurantsArray.first { let workingHours = firstRestaurant["workingHours"] as? String ?? "未提供营业时间" print("第一个餐厅营业时间:\(workingHours)") } }
方法二:用Codable自动解析(推荐,更优雅规范)
Swift的Codable协议可以帮你把JSON直接转成自定义模型,避免手动类型转换的麻烦,适合长期项目:
第一步:定义对应的数据模型
// 单个餐厅的模型 struct Restaurant: Codable { let id: Int let restaurantName: String let restaurantPicture: String let status: String let workingDays: String? // 因为你的第二个JSON对象里workingDays是截断的,设为可选类型更安全 let workingHours: String? } // 包裹整个JSON的模型 struct RestaurantResponse: Codable { let restaurants: [Restaurant] }
第二步:解析JSON并访问数组
do { // 把Data转成模型对象 let response = try JSONDecoder().decode(RestaurantResponse.self, from: jsonData) // 直接拿到restaurants数组 let allRestaurants = response.restaurants // 遍历数组 allRestaurants.forEach { restaurant in print("餐厅名称:\(restaurant.restaurantName),营业日:\(restaurant.workingDays ?? "未明确")") } // 访问数组中的某个元素(比如ID为3的餐厅) if let targetRestaurant = allRestaurants.first(where: { $0.id == 3 }) { print("ID为3的餐厅状态:\(targetRestaurant.status)") } } catch { print("JSON解析失败:\(error.localizedDescription)") }
两种方法里,Codable是更推荐的方案,因为它类型安全,代码更清晰,后期维护也更方便。如果是快速测试或者简单场景,手动解析也没问题~
内容的提问来源于stack exchange,提问作者Sam Banana
相关产品推荐
相关产品推荐

