swift4.1 編解碼

/*
本節來學習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)")
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章