swift中使用Codable協議實現json解析

2021-10-10 14:41:14 字數 1549 閱讀 6410

typealias codable = decodable & encodable

它其實另外兩個 protocol 的集合,也就是 decodable 和 encodable。 乙個用作資料解析,另乙個用作資料編碼。

建立乙個實體類,只宣告幾個屬性,將它例項編碼為json字串

struct person : codable

let person = person(name: 「swift」, gender: 「male」, age: 24)

let encoder = jsonencoder()

let data = try! encoder.encode(person)

let encodedstring = string(data: data, encoding: .utf8)!

print(encodedstring)

輸出結果:

如上所示,首先初始化了乙個 person 例項。 然後初始化了乙個 jsonencoder。 再呼叫它的 encode 方法,把 person 例項進行編碼

解析:let decoder = jsondecoder()

let result = try! decoder.decode(person.self, from: data)

print(result)

輸出: person(name: 「swift」, gender: 「female」, age: 22)

解析的時候用的是 jsondecoder 物件,給他的 decode 方法傳入要解析的例項型別 - person.self, ,再加上要解析的資料物件 jsondata 就完成了 json 資料的解析

struct person : codable }

輸出結果:

gender 屬性由於沒有在 codingkeys 中宣告,所以不會被編碼。 另外如果使用了 codingkeys,那些沒有在 codingkeys 中宣告的屬性就必須要要有乙個預設值,我們上面的**中其實給 gender 屬性也宣告了預設值。

還可以使用 codingkeys 改變編碼屬性的名稱:

struct person : codable 輸出結果:

struct person : codable

enum bodykeys: string, codingkey 形式:

}但是這樣宣告還不行,還需要過載

extension person

func encode(to encoder: encoder) throws }

decoder.container() 方法首先獲取 codingkey 的對應關係,這裡我們首先傳入 codingkeys.self 表示我們先前宣告的型別。 然後呼叫 vals.decode() 方法,用於解析某個單獨的屬性。 接下來呼叫 vals.nestedcontainer() 方法獲取內嵌的層級,也就是我們先前宣告的 bodykeys。然後繼續解析。

編碼的相關處理也大同小異,把上面解碼方法中的邏輯反向處理了一遍。

這樣,如果我們對新的 person 例項再進行編碼,得到的將會是這樣的結果:

}

在swift中使用執行緒休眠

c 和php都有sleep讓執行緒休眠指定時間後再繼續執行後面的 swift中應該如何呢?首先,找一下objective c版本是怎麼做的 self performselector selector didtimeout withobject nil afterdelay 60 順便演示下取消 ns...

Swift中使用protocol的注意事項

oc中protocol是用weak和assign修飾的弱引用.swift中protocol功能被增強了,如果使用以下 就會變成強引用.protocol testdelegate class test nsobject testdelegate static func test deinit clas...

Swift 中使用runtime交換方法實現

在swift的viewcontroller中寫了如下 func first func second override func viewdidload 執行結果 第乙個方法。發現沒有達到我們預期的目的,同樣的 用oc實現如下 void first void second void viewdidlo...