无法将我的JSON附加到数组

时间:2017-12-20 15:11:56

标签: json swift

我正在尝试将我的JSON追加到数组,但它给了我错误:

  

无法将'[String:Any]'类型的值转换为预期的参数类型'WeerItem'

WeerItem就是这样:

import Foundation
struct WeerItem : CustomStringConvertible {
    var description: String

    let city : City?
    let cod : Int?
    let message : Double?
    let cnt : Int?
    let list : [List]?

    init(dictionary: [String: Any]) {
        self.city = dictionary["city"] as? City ?? nil
        self.cod = dictionary["cod"] as? Int ?? 0
        self.message = dictionary["message"] as? Double ?? 0.0
        self.cnt = dictionary["cnt"] as? Int ?? 0
        self.list = dictionary["list"] as? [List] ?? nil
    }

}

这就是我调用JSON并将其添加到列表中的方式

var weerItems : [WeerItem] = []
let task = session.dataTask(with: request as URLRequest,
      completionHandler: { data, response, error -> Void in
           do {
               if let json = try JSONSerialization.jsonObject(with: data!) as? [[String: Any]] {
                  for weerData in json {
                    self.weerItems.append(weerData) //This line gives the error
                  }                         
              }
      } catch { print(error) }
})
task.resume()

示例JSON:

{  
   "city":{  
      "id":3080866,
      "name":"Zakopane",
      "coord":{  
         "lon":19.9507,
         "lat":49.2969
      },
      "country":"PL",
      "population":27580
   },
   "cod":"200",
   "message":43.5092521,
   "cnt":6,
   "list":[  
      {  
         "dt":1513764000,
         "temp":{  
            "day":-4,
            "min":-9.63,
            "max":-4,
            "night":-9.63,
            "eve":-7.41,
            "morn":-4
         },
         "pressure":924.37,
         "humidity":78,
         "weather":[  
            {  
               "id":600,
               "main":"Snow",
               "description":"light snow",
               "icon":"13d"
            }
         ],
         "speed":0.91,
         "deg":339,
         "clouds":36,
         "snow":0.63
      },
      {  
         "dt":1513850400,
         "temp":{  
            "day":-11.69,
            "min":-15.84,
            "max":-6.47,
            "night":-6.47,
            "eve":-6.71,
            "morn":-14.78
         },
         "pressure":923.24,
         "humidity":83,
         "weather":[  
            {  
               "id":601,
               "main":"Snow",
               "description":"snow",
               "icon":"13d"
            }
         ],
         "speed":1.01,
         "deg":190,
         "clouds":76,
         "snow":2.73
      },
      {  
         "dt":1513936800,
         "temp":{  
            "day":-3.4,
            "min":-8.82,
            "max":-2.63,
            "night":-3.69,
            "eve":-6.33,
            "morn":-3.8
         },
         "pressure":923.89,
         "humidity":93,
         "weather":[  
            {  
               "id":601,
               "main":"Snow",
               "description":"snow",
               "icon":"13d"
            }
         ],
         "speed":1.17,
         "deg":309,
         "clouds":48,
         "snow":1.54
      },
      {  
         "dt":1514023200,
         "temp":{  
            "day":-3.33,
            "min":-5.25,
            "max":-2.68,
            "night":-2.68,
            "eve":-5.01,
            "morn":-2.94
         },
         "pressure":920.7,
         "humidity":89,
         "weather":[  
            {  
               "id":601,
               "main":"Snow",
               "description":"snow",
               "icon":"13d"
            }
         ],
         "speed":2.93,
         "deg":341,
         "clouds":76,
         "snow":5.34
      },
      {  
         "dt":1514109600,
         "temp":{  
            "day":2.53,
            "min":2.04,
            "max":4.52,
            "night":4.52,
            "eve":3.25,
            "morn":2.04
         },
         "pressure":947.42,
         "humidity":0,
         "weather":[  
            {  
               "id":600,
               "main":"Snow",
               "description":"light snow",
               "icon":"13d"
            }
         ],
         "speed":5.23,
         "deg":305,
         "clouds":68,
         "rain":3.79,
         "snow":0.98
      },
      {  
         "dt":1514196000,
         "temp":{  
            "day":3.68,
            "min":-3.88,
            "max":3.71,
            "night":-3.88,
            "eve":0.81,
            "morn":3.71
         },
         "pressure":951.34,
         "humidity":0,
         "weather":[  
            {  
               "id":500,
               "main":"Rain",
               "description":"light rain",
               "icon":"10d"
            }
         ],
         "speed":3.1,
         "deg":270,
         "clouds":27,
         "rain":0.47
      }
   ]
}

1 个答案:

答案 0 :(得分:3)

您需要将Dictionary转换为WeerItem对象。由于您已经实现了自定义初始化程序,因此您可以调用它。

for weerData in json {
    self.weerItems.append(WeerItem(dictionary:weerData))
}

如果您使用的是Swift 4,则应WeerItem符合Decodable,然后您就不再需要自定义初始化程序。