昨天介绍了如何抓取 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()
}
}
明天会介绍如何呈现资料在手机画面上
敬请期待!
<<: Day 18 - [语料库模型] 06-程序码: TF、IDF、TF-IDF
>>: 从零开始的8-bit迷宫探险【Level 24】谁才是高玩?纪录本机最高得分
前言 所以说LIFF Bluetooth能用在哪里? 最近我买了一台智能电风扇,当觉得热,又觉得伫立...
今天我们要来制作新的专题:物品借用纪录微服务! 在学校,尤其是行政处室,最常出现的状况应该就是「借物...
(五)员工 我们目前拥有多名员工,分别是管理阶层、软件开发、硬体维护、营业部门、客户管理及财务和管理...
工欲善其事,必先利其器,好的开始是成功的一半~ 今天来把要使用的环境建立好 这次我选用的是线上编辑器...
GOOGLE登入 第一步:在firebase添加一个新的专案 第二步:选取android专案 第三步...