HandyJSON介紹及使用

一、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-hk/n/291709.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-25 14:06
下一篇 2024-12-25 14:06

發表回復

登錄後才能評論