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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:48:48