[網路應用] JSON 文字處理- 將 Data(Dictionary , Array) 轉換成 JSON String 格式
資策會 APP Developer 行動開發工程師養成班
▍JSON 文字處理簡介
JSON 是一種回傳資料的形式,全名 JavaScript Object Notation
常被應用於 web 開發,甚至比 XML 的資料格式還要常被拿來應用
目前 Google, Facebook, Twitter, Dropbox 都利用 JSON 作為 API 資料交換的格式
▍JSON 資料格式
- 字串:以 “ “ 括起來的表示文字
- 數值:ㄧ系列 0–9 的數字組合,可以為負數或是小數,不會有 “ “
- 布林值:表示為 true 或者 false,不會有 “ “
- null:表示某ㄧ個值為空值,寫法:NSNull()
- {}:以 Key:Value 組成的資料格式,經過轉換會成為 Dictionary
接近 Objective-C 用法 - []:表示為矩陣的資料格式,轉換成為 Array
接近 Swift 用法,[] 可能是 Array 或者 Dictionary,看有沒有冒號:
▍JSONSerialization Class 轉換
將 Data(Dictionary , Array) 轉換成 JSON 格式的 String
class func data(withJSONObject obj: Any:,options opt: WritingOptions) throws -> Data
Data 方法內會有 Dictionary 或者 Array,產生 Data 格式後,再轉換成 String
Option 內會有 prettyPrinted,指定 prettyPrinted 會產生換行、空格,在 debug 時比較好閱讀,但空間較為浪費。
▍練習:將 Dictionary 資料透過 JSONSerialization.data 轉成 Data,把資料傳給對方的伺服器
規格:利用 Dictionary 及 Array 產生同樣規格的 JSON String,JSON String 要有 Key & Value,address 內有資料
在 ViewController 內的 viewDidLoad 做測試
Dictionary 內是沒有順序的,只有 key & value
舉例上圖的 office, home:
Array 內會按照順序顯示結果
Array 內的 Dictionary:type, number ,就不會照著順序顯示結果
也有些程式語言的 Dictionary 是可以按照順序顯示的~
如果不給 Option [.prettyPrinted],就會印出一行文字,去除換行機制
有[.prettyPrinted],比較容易得知結構樣貌
▍JSON 轉換的錯誤處理 — 1
方式ㄧ:建議ㄧ定要使用 do-catch,印出 error 才知道錯誤出在哪裡
方式二:try 不使用 do-catch,可以加上?變成 optional
改寫 try -> try?
String(data: data) 是不允許使用 optional,要將 let 改成 If let
不建議使用方法二,因為轉成 JSON 若發生失敗時,會需要明確知道為何失敗,不知道失敗在哪裡,就不知道該如何處理?
當發生問題時,if let 後方的 data 就會變成空值,造成沒辦法除錯處理問題
方式三:try 不使用 do-catch,可以加上!保證不會有錯誤!
當程式碼加上!,是程式設計師保證不會出錯;但如果有錯誤發生,程式碼會直接當掉…
▍JSON 轉換的錯誤處理 — 2
Q:當 server 伺服器的格式改變怎麼辦?
根據文字最後結果反推程式應該如何撰寫;若對方伺服器做修改時,可能會影響自己撰寫的程式運作,因此發生邏輯規則不符合,需要修改程式碼的情況,造成程式處於不穩定的情況;因此不能假設程式只需要寫一次之後就不需要再做調整。
Q:先前取得經緯度座標的練習都是用 as? 來轉型,為何不用 as! 來轉型?
用 as? 處理,若對方傳進來的資料不是自己能夠正確轉型的,程式碼就會跳過不執行,代表 if let 不執行,不會造成程式碼當機。
若用 as! 處理,若對方傳進來的資料ㄧ但找不到時,就會造成程式碼當機!
▍JSON 資料優缺點
優點:容易閱讀、理解
缺點:資料結構鬆散,不是嚴謹的結構,無法事先預測會傳送什麼資料進來,若資料變更,自己不ㄧ定會知道。
處理 JSON 格式ㄧ定要特別小心,無法保證第二次傳送資料進入的時候,是否跟第ㄧ次相同,因此都選擇用 optional 的方式處理資料。
將 JSON String 轉換成 Data(Dictionary , Array) 格式教學,可以參考這篇: