更棒的是,有越來越多的網站,開放其程式介面(Open API),也是使用JSON格式來交換資料,例如 Google map, Apple Music, Facebook 等等,國內的政府資料開放平台(Open Data)也部分提供JSON格式,因此,學會在程式中使用JSON格式,未來結合網路程式,就能延伸到各大網站,享受無窮盡的資料寶藏。
請下載 "2-7 台灣特有種鳥類 - 2021.json" 到自己設備或放在 iCloud雲端,方便匯入到 Swift Playgrounds 裡面,匯入的方式跟圖片類似,但是要選「所有類型」,如下:
確認檔案匯入之後,就可以執行以下的範例程式,執行結果會輸出到主控台(如上圖右側)。
// 2-7a 傑森解碼器 // Created by Heman, 2021/08/18 import Foundation
struct 鳥類: Codable, Identifiable { var id: Int var 中文名: String var 別名: String var 科名: String var 英文名: String var 圖片檔名: String var 圖片來源: String var 攝影者: String }
func 傑森解碼器(_ 檔名: String) -> [鳥類]? { if let 檔案 = Bundle.main.url(forResource: 檔名, withExtension: "json") { do { let 資料 = try Data(contentsOf: 檔案) let 結果 = try JSONDecoder().decode([鳥類].self, from: 資料) return 結果 } catch { print("error:\(error)") } } return nil }
let 特有種清單 = 傑森解碼器("2-7 台灣特有種鳥類 - 2021") ?? []
for 鳥種 in 特有種清單 { print(鳥種.id, 鳥種.中文名, "\t", 鳥種.英文名, "\t", 鳥種.圖片來源) }
這個範例程式不需要圖形介面,因此只要 import Foundation 即可,我們要從 Foundation 物件庫中取出的物件稱為 JSONDecoder (傑森解碼器),這個物件的用法如下:
let 結果 = try JSONDecoder().decode([鳥類].self, from: 資料)
struct 鳥類: Codable, Identifiable { var id: Int var 中文名: String var 別名: String var 科名: String var 英文名: String var 圖片檔名: String var 圖片來源: String var 攝影者: String }
// 2-7b 台灣特有種鳥類 // Created by Heman, 2021/08/18 import PlaygroundSupport import SwiftUI
struct 鳥類: Codable, Identifiable { var id: Int var 中文名: String var 別名: String var 科名: String var 英文名: String var 圖片檔名: String var 圖片來源: String var 攝影者: String }
func 傑森解碼器(_ 檔名: String) -> [鳥類]? { if let 檔案 = Bundle.main.url(forResource: 檔名, withExtension: "json") { do { let 資料 = try Data(contentsOf: 檔案) let 結果 = try JSONDecoder().decode([鳥類].self, from: 資料) return 結果 } catch { print("error:\(error)") } } return nil }
let 特有種清單 = 傑森解碼器("2-7 台灣特有種鳥類 - 2021") ?? []
for 鳥種 in 特有種清單 { print(鳥種.id, 鳥種.中文名, "\t", 鳥種.英文名, "\t", 鳥種.圖片來源) }
struct 相框: View { var 檔名: String init(_ p: String) { 檔名 = p } var body: some View { if 檔名 == "" { Image(systemName: "camera.circle") .resizable() .scaledToFit() .foregroundColor(.red) .opacity(0.4) } else { Image(uiImage: UIImage(named: 檔名)!) .resizable() .scaledToFit() } } }