使用Swift 4中的Decodable从嵌套JSON创建列表

时间:2018-04-01 19:20:37

标签: json swift struct swift4 decodable

我已经能够使用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,来自:数据)

非常感谢任何帮助。

3 个答案:

答案 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]?
}