/*
本節來學習swift的編碼、解碼和串行化。
爲什麼需要編解碼?
許多的編程任務涉及到通過網絡發送數據、將數據保存到磁盤上,或是將數據提交到API以及
服務上。這些任務往往需要將數據進行編碼到一箇中間格式然後在進行傳輸,或是在傳輸結束後將中間格式轉換回
原始數據,然後在進行處理。這就需要提供一種能方便對數據進行編碼、解碼的機制了。
原始數據---編碼---提交傳輸----解碼----原始數據
swift 提供了標準化的方法對數據進行編碼和解碼。
編碼: Encodable協議
解碼: Decodable協議
如果自定義類型要同時遵循Encodable與Decodable協議,就可以直接用 Codable 協議。
Apple的Foundation庫提供了兩種編碼器類,分別是 JSONEncoder / JSONDecoder,
PropertyListEncoder / PropertyListDecoder
JSONEncoder / JSONDecoder: 對象實例與json數據格式之間進行轉換;
PropertyListEncoder / PropertyListDecoder: 對象實例與XML數據格式之間進行互相轉換。
*/
do {
struct MyObject: Codable {
var a = 10
var str = "Hello"
var array = [1, 2, 3]
}
let obj = MyObject()
// 將obj轉爲JSON字符串
let encoder = JSONEncoder()
// 注意,JSONEncoder的encoder方法返回的是一個Data類型的對象
let jsonData = try? encoder.encode(obj)
if let jsonData = jsonData,
let jsonStr = String(data: jsonData, encoding: .utf8) {
print("Json string is : \(jsonStr)")
}
// 以下是將一個json data轉爲MyObject對象
let decoder = JSONDecoder()
let newObj = try? decoder.decode(MyObject.self, from: jsonData!)
if let obj = newObj {
print("a = \(obj.a)")
print("str = \(obj.str)")
print("array = \(obj.array)")
}
}
// 將自定義類型轉爲XML
do {
struct MyObject: Codable {
var a = 10
var str = "Hello"
var array = [1, 2, 3]
}
let obj = MyObject()
let encoder = PropertyListEncoder()
encoder.outputFormat = .xml
let xmlData = try? encoder.encode(obj)
if let xmlData = xmlData,
let xmlStr = String.init(data: xmlData, encoding: .utf8) {
print("Xml string is: \(xmlStr)")
}
// 將XML Data轉爲MyObject對象
let decoder = PropertyListDecoder()
let newObj = try? decoder.decode(MyObject.self, from: xmlData!)
if let obj = newObj {
print("a = \(obj.a)")
print("str = \(obj.str)")
print("array = \(obj.array)")
}
}