简体   繁体   English

Swift4-数组的JSON可解码问题(无法下标值)

[英]Swift4 - JSON Decodable issue with array (Cannot subscript a value)

I'm parsing weather JSON using Swift 4 Decodable, and i have an issue with array data. 我正在使用Swift 4 Decodable解析天气JSON,并且数组数据存在问题。 I'm think i may be a bit wrong with model (because there are bunch of decodable structs), please help. 我认为我可能对模型有点错误(因为有很多可解码的结构),请帮忙。

JSON Data from the weather API: 来自天气API的JSON数据:

{"coord":{"lon":-43.21,"lat":-22.9},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01d"}],
"base":"stations","main":{"temp":299.37,"pressure":1008,"humidity":51,"temp_min":296.15,"temp_max":302.15},
"visibility":10000,"wind":{"speed":4.1,"deg":320},"clouds":{"all":0},
"dt":1510909200,"sys":{"type":1,"id":4565,"message":0.0023,"country":"BR","sunrise":1510905615,
"sunset":1510953350},"id":3451190,"name":"Rio de Janeiro","cod":200}

Model: 模型:

struct WeatherData:Decodable {
let coord:CoordDict?
let weather:[WeatherArr]?
let base: String?
let main:MainDict?
let visibility:Int?
let wind:WindDict?
let clouds:CloudsDict?
let dt:Int?
let sys:SysDict?
let id:Int?
let name:String?
let cod:Int?}

struct CoordDict:Decodable {
let lon: Double?
let lat: Double?}

struct WeatherArr:Decodable {
let id: Int?
let main:String?
let description:String?
let icon: String?}

struct MainDict:Decodable {
let temp:Double?
let pressure:Double?
let humidity:Int?
let temp_min:Double?
let temp_max:Double?
let sea_level:Double?
let grnd_level:Double?}

struct WindDict:Decodable {
let speed:Double?
let deg:Double?}

struct CloudsDict:Decodable {
let all: Int?}

struct SysDict:Decodable {
let type:Int?
let id:Int?
let message:Double?
let country:String?
let sunrise:Int?
let sunset:Int?}

Parsing JSON data using JSONDecoder: 使用JSONDecoder解析JSON数据:

    let jsonUrlString = ("https://api.openweathermap.org/data/2.5/weather?lat=\(lat!)&lon=\(lon!)&APPID=\(apikey)")

    guard let url = URL(string: jsonUrlString) else { return }

    URLSession.shared.dataTask(with: url) { (data, response, err) in

        //check err
        if err != nil {
            print("Error:\(String(describing: err))")
        }

        guard let data = data else { return }
        //do stuff

        do {

            let weatherData = try JSONDecoder().decode(WeatherData.self, from: data)

            print(weatherData.name, weatherData.weather)

   //Here i can't parse the weather Array, and get xcode error

     if let wArr = weatherData.weather! as? Array<AnyObject> {
                if let weatherIcon = wArr["icon"] {
                  icon = weatherIcon
                    }
                }
        } catch let jsonErr {
            print("Error:\(jsonErr)")
        }

        }.resume()//URLSession

ERROR msg: Cannot subscript a value of type 'Array' with an index of type 'String'. 错误消息:无法用索引类型“字符串”下标“数组”类型的值。

How can i fix this? 我怎样才能解决这个问题? How can i parse weather array elements? 我如何解析天气数组元素?

Declare weather in the WeatherData struct as non-optional. WeatherData结构中声明weather为非可选。 There is always a weather 总是有天气

let weather : [WeatherArr]

Get the first item if the array and the icon 如果数组和图标获得第一项

if let currentWeather = weatherData.weather.first {
   if let weatherIcon = currentWeather.icon  {
      print(weatherIcon)
   }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM