昨天介紹了如何抓取 API,今天來介紹如何根據 JSON 寫一個 struct。
為了接收 API Response 的資訊,可以根據 JSON 寫一個 struct,用事先宣告好的變數,去撈取資訊。
在專案底下 New Group / New File / 選 Cocoa Touch Class
在 Weather.swift 檔案裡依照JSON格式來寫結構
import UIKit
//依照JSON格式來寫結構
struct Weather: Codable {
var records: records
}
struct records: Codable {
var location: [location]
}
struct location: Codable {
var locationName: String
var weatherElement: [weatherElement]
}
struct weatherElement: Codable {
var elementName: String
var time: [time]
}
struct time: Codable {
var startTime: String
var endTime: String
var parameter: parameter
}
struct parameter: Codable {
var parameterName: String
//parameterValue 和 parameterUnit 不一定存在
var parameterValue: String?
var parameterUnit: String?
}
在 ViewController.swift 加入程式碼,執行看看,確認寫的結構沒有問題。
import UIKit
import Foundation
#if canImport(FoundationNetworking)
import FoundationNetworking
#endif
class MainVC: UIViewController {
var authorization = "CW*******授權碼********92" // 會員授權碼
override func viewDidLoad() {
super.viewDidLoad()
getWeatherData() // 進入畫面前先讀一次 JSON
}
// MARK: - 透過JSON抓取OpenWeatherMap的天氣資訊
func getWeatherData() {
let oldurl = "https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=\(authorization)&format=JSON&locationName=%E5%AE%9C%E8%98%AD%E7%B8%A3"
let newUrl = oldurl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! // 網址有中文,需要先編碼
var request = URLRequest(url: URL(string: newUrl)!,timeoutInterval: Double.infinity)
request.httpMethod = "GET"
let task = URLSession.shared.dataTask(with: request) { [self] data, response, error in
let decoder = JSONDecoder()
if let data = data, let weather = try? decoder.decode(Weather.self, from: data){
print(weather)
// 顯示在主畫面Lable上的資訊
DispatchQueue.main.sync {
// 顯示地名
self.locationName.text = weather.records.location[0].locationName
// 降雨機率
self.pop.text = weather.records.location[0].weatherElement[1].time[0].parameter.parameterName + "%"
// 最低溫度
self.minT.text = weather.records.location[0].weatherElement[2].time[0].parameter.parameterName + "°" + weather.records.location[0].weatherElement[2].time[0].parameter.parameterUnit!
// 最高溫度
self.maxT.text = weather.records.location[0].weatherElement[4].time[0].parameter.parameterName + "°" + weather.records.location[0].weatherElement[4].time[0].parameter.parameterUnit!
// 舒適度
self.wx.text = weather.records.location[0].weatherElement[0].time[0].parameter.parameterName
// 背景依據舒適度而改變
self.descriptionToImage()
}
}
else {print("error")}
}
task.resume()
}
}
明天會介紹如何呈現資料在手機畫面上
敬請期待!