一、HandyJSON原理
HandyJSON是一個輕量級的JSON轉換庫,它可以將JSON數據轉換成Swift對象。使用HandyJSON可以簡化Swift對象的JSON解析操作,將大量的解析代碼簡化為數行代碼。HandyJSON的原理是將JSON數據轉化為Swift模型,在Swift模型中實現屬性與JSON中的鍵值對的映射關係,從而實現JSON數據的轉換。
二、HandyJSON如何自定義解析
在解析JSON數據時,有些情況下需要對JSON數據進行一些處理後才能將其轉換成Swift模型。在HandyJSON中,我們可以通過實現HandyJSON協議中的兩個方法來實現自定義解析。第一個方法是mapping(mapper: Mapper),通過手動解析來將JSON中的值映射到Swift屬性上。第二個方法是jsonDidTransform(mapping: JSONTransform),允許我們在進行數據轉換時使用自定義的JSON轉換類型。
class User: HandyJSON {
var name: String?
var age: Int?
func mapping(mapper: Mapper) {
name <- mapper["nickName"]
age <- mapper["ages"]
}
}
三、HandyJSON源碼解析
HandyJSON源碼中最核心的部分是它的解析器JASONDeserializer。JASONDeserializer是一個遞歸解析器,它可以將任意的JSON數據解析成Swift對象。在解析過程中,JASONDeserializer會使用一個JSON字典棧來保存當前解析所在的層數、當前解析的JSON數據和解析後生成的Swift對象。
四、HandyJSON數組轉模型
在實際開發中,需要經常將一個JSON數組轉換成一個模型數組。HandyJSON提供了較為簡便的實現方法。在模型中定義一個數組類屬性(可以不賦初始值),並且讓這個數組屬性遵循HandyJSON的協議。在初始化過程中,使用HandyJSON提供的arrayIn<Type: HandyJSON>函數即可完成將JSON數組轉換為對應的模型數組。
class UserModel: HandyJSON {
var users: [User]?
required init() {}
}
let userModel = UserModel.deserialize(from: jsonString)
let users = userModel?.users
五、HandyJSON自定義解析
有些JSON數據不符合我們的要求,我們需要使用一些特定的方法,對其進行自定義的解析。實現HandyJSON協議的Mapping方法即可簡單地達到這個目的。在Mapping方法中可以用<-符合將Swift對象映射到特定的JSON對象中。
class CustomUser: HandyJSON {
var name: String?
var age: Int?
required init() {}
func mapping(mapper: Mapper) {
name <- mapper["nickName"]
age Int? {
guard let ratio = ratio else {
return 0
}
return Int(ratio)
}
}
六、HandyJSON解析網絡請求
當我們使用API請求獲取JSON數據時,HandyJSON也可以方便的將JSON數據轉換為模型。在Alamofire的基礎上,我們只需要將JSON數據作為參數傳遞給HandyJSON的簡易解析方法即可。
Alamofire.request(apiUrl).responseJSON { (dataResponse) in
if let value = dataResponse.result.value,
let users = [User].deserialize(from: value as? String) {
completion(users.compactMap { $0 })
} else {
completion(nil)
}
}
七、HandyJSON在iOS15閃退
在iOS15中,關於HandyJSON數組轉模型的使用存在着某些問題,存在內存泄漏、上下文不對等問題,可能會導致閃退。解決方法是可以將手動轉換成Codable對其解析(相對於它更安全)或者升級HandyJSON到4.3.0+版本。
class User: Codable {
var name: String
var age: Int
}
let users = try JSONDecoder().decode([User].self, from: jsonData)
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/291709.html
微信掃一掃
支付寶掃一掃