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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:54:04