如何用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类中添加对应的属性即可,步骤很简单:
- 创建Category结构体:匹配JSON中categories元素的结构,包含
alias和title字段 - 在Business类中添加categories属性:类型为
[Category](对应JSON中的数组类型) - 修正自定义初始化器:确保参数包含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
相关产品推荐
相关产品推荐

