Swift解析OpenWeatherAPI JSON获取城市名及可选类型使用疑问
问题解决方案
1 正确解析获取城市名
你的解析失败核心原因是结构体定义与JSON实际结构不匹配:OpenWeather预报接口返回的城市名name字段,不属于list数组的子元素,而是存放在根节点下的city对象中,你在List结构体中定义的name无法匹配到对应字段,因此返回空值。
正确的结构体定义如下:
struct WeatherData: Decodable{ let message: String? let list: [List]? let city: City? // 新增根节点下的city字段映射 } // 新增City结构体解析城市相关字段 struct City: Decodable { let name: String? } struct List: Decodable{ // 此处存放list数组下的对应字段,无需定义name }
修改后的解析代码如下,同时避免强制解包导致的崩溃问题:
func parseJSON(weatherData: Data) { let decoder = JSONDecoder() do{ let decodedData = try decoder.decode(WeatherData.self, from: weatherData) // 可选绑定安全获取城市名 if let cityName = decodedData.city?.name { print(cityName) } else { print("未获取到有效城市名") } }catch{ print("解析失败:\(error)") } }
2 可选类型使用说明
解析JSON时不必须全部使用可选类型定义属性:
- 如果对应字段是API约定一定会返回的核心字段,你可以定义为非可选类型,此时如果JSON缺失该字段,整个解析流程会直接失败,进入catch分支返回错误。
- 如果字段是可能缺失的非核心字段,或者你希望某个字段缺失时不影响其他数据的解析,就使用可选类型定义,字段缺失时对应属性会自动赋值为nil,其余正常字段可正常解析。
- 日常开发中建议尽量避免使用
!强制解包可选值,优先使用if let、guard let做安全解包,避免空值导致的APP崩溃。
内容的提问来源于stack exchange,提问作者Equlo
相关产品推荐
相关产品推荐

