我已经能够使用Swift 4的Decodable将JSON转换为结构体,遗憾的是,我无法使用名为" list"的JSON键进行转换。 ,这是一个包含其他结构的列表([])。
{
"cod":"200",
"message":0.0061,
"cnt":5,
"list":[
{
"dt":1522605600,
"main":{ },
"weather":[ ],
"clouds":{ },
"wind":{ },
"rain":{ },
"sys":{ },
"dt_txt":"2018-04-01 18:00:00"
},
{
"dt":1522616400,
"main":{ },
"weather":[ ],
"clouds":{ },
"wind":{ },
"rain":{ },
"sys":{ },
"dt_txt":"2018-04-01 21:00:00"
},
{
"dt":1522627200,
"main":{
"temp":277.21,
"temp_min":277.21,
"temp_max":277.506,
"pressure":1016.3,
"sea_level":1023.98,
"grnd_level":1016.3,
"humidity":84,
"temp_kf":-0.3
},
这些是我的结构,我的方法是使ForecastInstance成为拥有财产的整个容器" list" (如JSON)类型为ForecastList(包含嵌套结构)。
struct ForecastInstance : Decodable {
let list: [ForecastList]?
}
struct ForecastList : Decodable {
let dt : Int?
let weather : [Weather]?
let main : Main?
let wind : Wind?
}
struct Wind : Decodable {
let speed: Float
}
struct Coord : Decodable {
let lon : Float
let lat : Float
}
struct Main : Decodable{
let temp : Double
let pressure : Int
let humidity : Int
let temp_min: Double
let temp_max: Double
}
struct Weather : Decodable{
let id : Int
let main: String
let description: String
let icon: String
}
当我在视图控制器中执行以下操作时,它会失败。
self.currentForecast =试试 JSONDecoder()进行解码。(ForecastInstance.self,来自:数据)
非常感谢任何帮助。
答案 0 :(得分:0)
这是我的错误
debugDescription:“Parsed JSON number< 1017.42>不适合Int。”,underlyingError:nil))
将Int类型的属性压力更改为float就可以了。
答案 1 :(得分:0)
它适用于游乐场! 这是一篇关于Codable的好文章: Swift 4 Decodable: Beyond The Basics。 我希望它会有所帮助。
let weatherJSON = """
{
"list": [{
"dt": 1522605600,
"main": {
"temp": 30,
"humidity": 50,
"pressure": 40
},
"weather": ["cloudly"],
"clouds": {},
"wind": {},
"rain": {},
"sys": {},
"dt_txt": "2018-04-01 18:00:00"
}]
}
""".data(using: .utf8)!
struct Main: Codable {
let temp: Int?
let humidity: Int?
let pressure: Int?
}
struct Weather: Codable {
let dt: Int?
let main: Main?
let weather: [String]?
}
struct WeatherList: Codable {
let list: [Weather]?
}
let weather = try JSONDecoder().decode(WeatherList.self, from: weatherJSON)
let count = "\(weather.list?.count ?? 0)"
print(count)
答案 2 :(得分:-1)
您的顶级结构需要看起来像这样来模仿您的JSON结构。如果您仍然遇到错误,其余的结构看起来很好我建议您重新查看这些结构。
struct ForecastInstance : Decodable {
let cod: String?
let message: Int?
let cnt: Int?
let list: [ForecastList]?
}