Swift中解析Google Places JSON Reviews并在视图展示的问题
解决Google Places Reviews字段解析问题
嘿,我一眼就瞅出问题所在啦!你把reviews的类型搞错了——它是个字典数组([[String: Any]]),不是单个字典([String: Any]),所以第一行的类型转换直接失败,自然进不去后面的逻辑。咱们一步步来修正:
1. 先定义评论模型(可选,但代码更整洁)
先建个专门的Review类来存评论数据,后续操作更清晰:
class Review: NSObject { var authorName: String? var text: String? var rating: Int? var relativeTime: String? init(dict: [String: Any]) { super.init() authorName = dict["author_name"] as? String text = dict["text"] as? String rating = dict["rating"] as? Int relativeTime = dict["relative_time_description"] as? String } }
2. 修改EClass,添加评论解析逻辑
在你的EClass里新增评论属性,然后在初始化方法里正确解析数组:
private let geometryKey = "geometry" private let locationKey = "location" private let latitudeKey = "lat" private let longitudeKey = "lng" private let reviewsKey = "reviews" // 新增评论字段的key class EClass: NSObject { var placeId: String! var location: CLLocationCoordinate2D? var reviews: [Review] = [] // 存储所有评论 init(placeInfo:[String: Any]) { super.init() // 解析placeId(建议用可选绑定替代强制解包,避免崩溃) placeId = placeInfo["place_id"] as? String ?? "" // 你的坐标解析逻辑没问题,保留 if let g = placeInfo[geometryKey] as? [String:Any] { if let l = g[locationKey] as? [String:Double] { if let lat = l[latitudeKey], let lng = l[longitudeKey] { location = CLLocationCoordinate2D(latitude: lat, longitude: lng) } } } // 重点:正确解析评论数组 if let reviewsArray = placeInfo[reviewsKey] as? [[String: Any]] { reviews = reviewsArray.map { Review(dict: $0) } } } }
3. 在视图中展示评论
现在你可以从EClass实例里取出评论,展示到Label上。比如展示第一条评论,或者把所有评论拼接起来:
// 假设你已经有了EClass的实例,比如叫placeData if let firstReview = placeData.reviews.first { // 展示第一条评论的作者和内容 myLabel.text = "\(firstReview.authorName ?? "匿名用户"):\n\(firstReview.text ?? "暂无评论")" } else { myLabel.text = "暂无评论" } // 如果要展示所有评论,用joined拼接成字符串: let allReviewsText = placeData.reviews.compactMap { review in guard let author = review.authorName, let text = review.text else { return nil } return "\(author): \(text)" }.joined(separator: "\n\n") myLabel.text = allReviewsText.isEmpty ? "暂无评论" : allReviewsText
为啥原来的代码不行?
你原来写的place.details?["reviews"] as? [String:Any]是错误的——API返回的reviews是用[]包裹的数组,每个元素才是{}包裹的字典。所以类型转换必须是[[String: Any]],才能遍历数组里的每一条评论。
内容的提问来源于stack exchange,提问作者fisherM
相关产品推荐
相关产品推荐

