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

如何用Swift Codable访问Yelp JSON中categories的title字段?

如何用Swift Codable解析Yelp JSON中的categories数组并访问title字段

问题描述

我从Yelp获取了如下简化的JSON数据:

{
  "businesses": [
    {
      "id": "fob-poke-bar-seattle-2",
      "name": "FOB Poke Bar",
      "is_closed": false,
      "review_count": 421,
      "categories": [
        { "alias": "poke", "title": "Poke" },
        { "alias": "salad", "title": "Salad" },
        { "alias": "hawaiian", "title": "Hawaiian" }
      ],
      "rating": 5,
      "coordinates": { "latitude": 47.6138005187095, "longitude": -122.343868017197 },
      "price": "$$",
      "location": {
        "city": "Seattle",
        "zip_code": "98121",
        "country": "US",
        "state": "WA",
        "display_address": ["220 Blanchard St", "Seattle, WA 98121"]
      }
    }
  ]
}

我已经能通过Codable访问name等一级属性,也能解析嵌套的coordinates字段,但不知道如何处理categories这个字典数组,进而访问其中的title字段。

解决方案

其实只需要给categories数组中的元素创建一个对应的Codable结构体,然后在Business类中添加对应的属性即可,步骤很简单:

  1. 创建Category结构体:匹配JSON中categories元素的结构,包含alias和title字段
  2. 在Business类中添加categories属性:类型为[Category](对应JSON中的数组类型)
  3. 修正自定义初始化器:确保参数包含categories,避免编译错误

完整代码示例

class Business: Codable {
    let name: String
    let rating: Double
    let coordinates: Coordinates
    let categories: [Category] // 新增对应categories数组的属性

    // 原有的Coordinates结构体
    struct Coordinates: Codable {
        let latitude: Double
        let longitude: Double
    }

    // 新增Category结构体,匹配JSON中的分类对象
    struct Category: Codable {
        let alias: String
        let title: String
    }

    // 自定义初始化器,包含所有必要参数
    init(name: String, rating: Double, coordinates: Coordinates, categories: [Category]) {
        self.name = name
        self.rating = rating
        self.coordinates = coordinates
        self.categories = categories
    }
}

访问title字段

当你完成解析得到Business实例后,就可以通过遍历categories数组来访问每个分类的title:

// 假设你已经解析得到了一个business实例(比如从JSON数据解码而来)
for category in business.categories {
    print("分类名称:\(category.title)")
    // 输出结果:
    // 分类名称:Poke
    // 分类名称:Salad
    // 分类名称:Hawaiian
}

补充说明

  • 因为我们的结构体属性名和JSON中的字段名完全一致(都是小写的alias和title),所以不需要额外定义CodingKeys,Codable会自动匹配。
  • 如果需要修改Swift中的属性名(比如把title改成categoryName),可以通过CodingKeys映射:
    struct Category: Codable {
        let alias: String
        let categoryName: String
    
        enum CodingKeys: String, CodingKey {
            case alias
            case categoryName = "title"
        }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:28:00