从HandyJSON迁移到SmartCodable:无缝过渡的完整指南
【免费下载链接】SmartCodableSmartCodable is a data parsing library built on Swift’s Codable, designed for simple usage and strong real-world compatibility. It gracefully handles missing fields, default values, and evolving JSON structures. SmartCodable 是基于 Swift Codable 的数据解析库,主打简单易用与真实业务场景下的强兼容性,能够优雅应对不断变化的 JSON 数据。项目地址: https://gitcode.com/gh_mirrors/smar/SmartCodable
SmartCodable是基于Swift Codable的数据解析库,主打简单易用与真实业务场景下的强兼容性,能够优雅应对不断变化的JSON数据。对于正在使用HandyJSON的开发者来说,迁移到SmartCodable不仅能解决HandyJSON存在的安全性问题,还能获得更好的性能和更丰富的功能支持。
为什么选择从HandyJSON迁移?
HandyJSON曾是Swift开发者常用的数据解析库,但它使用Swift的反射特性来实现数据的序列化和反序列化,该机制被证明是非法且不安全的。而SmartCodable基于Swift标准库的Codable协议构建,提供了一种声明式的方式来进行序列化和反序列化,更为通用和安全。
SmartCodable与HandyJSON核心功能对比
| 序号 | 特性 | 特性说明 | SmartCodable | HandyJSON |
|---|---|---|---|---|
| 1 | 强大的兼容性 | 完美兼容:字段缺失 & 字段值为nul & 字段类型错误 | ✅ | ✅ |
| 2 | 类型自适应 | 如JSON中是一个Int,但对应Model是String字段,会自动完成转化 | ✅ | ✅ |
| 3 | 解析Any | 支持解析[Any], [String: Any]等类型 | ✅ | ✅ |
| 4 | 解码回调 | 支持Model解码完成的回调,即:didFinishingMapping | ✅ | ✅ |
| 5 | 超复杂的数据解码 | 解码过程中,多数据做进一步的整合/处理。如:数据的扁平化处理 | ✅ | ⚠️ |
| 6 | 解码性能 | 在解码性能上,SmartCodable平均强30% | ✅ | ⚠️ |
| 7 | 异常解码日志 | 当解码异常进行了兼容处理时,提供排查日志 | ✅ | ❌ |
| 8 | 安全性方面 | 底层实现的稳定性和安全性 | ✅ | ❌ |
迁移难度评估
| 内容项 | 内容项说明 | 使用场景 | 替换难度 | 评判理由 |
|---|---|---|---|---|
| ①声明Model | 声明Model | ★★★★★ | ★☆☆☆☆ | 全局将HandyJSON替换为SmartCodable即可 |
| ②反序列化 | 数据的模型化(数据转Model) | ★★★★★ | ☆☆☆☆☆ | 完全一样的调用方式,无需处理 |
| ③序列化 | 模型的数据化(Model转数据) | ★☆☆☆☆ | ★☆☆☆☆ | 将toJSON()替换为toDictionary()或toArray() |
| ④解码完成的回调 | 解析完成进一步处理数据 | ★★☆☆☆ | ☆☆☆☆☆ | 完全一样的调用方式,无需处理 |
| ⑤自定义解析Key | 忽略key的解析 & 自定义Key的映射关系 | ★★★☆☆ | ★★★☆☆ | 需要更改调用方式 |
| ⑥解析Any | 解析Any类型的数据 | ★☆☆☆☆ | ★☆☆☆☆ | 将Any替换为SmartAny |
| ⑦处理继承关系 | 解析存在的继承关系的Model | ★☆☆☆☆ | ★☆☆☆☆ | 使用@SmartSubclass修饰子Model |
| ⑧枚举的解析 | 解析枚举属性 | ★☆☆☆☆ | ★☆☆☆☆ | 多实现一个defaultCase |
详细迁移步骤
1. 声明Model
除了遵守的协议不同外,其他一样。你只需要做一件事,将HandyJSON替换为SmartCodable。
HandyJSON
import HandyJSON class HandyModel: HandyJSON { var name: String = "" required init() { } } struct HandyModel: HandyJSON { var name: String = "" }SmartCodable
import SmartCodable class SmartModel: SmartCodable { var name: String = "" required init() { } } struct SmartModel: SmartCodable { var name: String = "" }2. 反序列化
在反序列化中,可以完全无障碍的平替,不需要代码改动。
注意:使用HandyJSON解码数组时候,需要使用 as? [HandyModel] 进行可选解包。SmartCodable中是不需要的,当然不删除也不会报错。你可以全局搜索) as? [,查找删除。
HandyJSON
guard let handyModel = HandyModel.deserialize(from: dict) else { return } guard let handyModels = [HandyModel].deserialize(from: [dict]) as? [HandyModel] else { return }SmartCodable
guard let smartModel = SmartModel.deserialize(from: dict) else { return } guard let smartModels = [SmartModel].deserialize(from: [dict]) else { return }3. 序列化
在序列化中,需要少量的代码改动。需要将toJSON()替换为toDictionary()或toArray()。
HandyJSON
let toDict = handyModel.toJSON() let toJsonStr = handyModel.toJSONString() let toArr = handyModels.toJSON() let toArrStr = handyModels.toJSONString()SmartCodable
let toDict1 = smartModel.toDictionary() let toJsonStr1 = smartModel.toJSONString() let toArr1 = smartModels.toArray() let toArrStr1 = smartModels.toJSONString()4. 解码完成的回调
使用didFinishMapping处理解码完成时的回调。两者完全一样,不需要任何替换工作量。
HandyJSON
struct HandyModel: HandyJSON { var name: String = "" func didFinishMapping() { } }SmartCodable
struct SmartModel: SmartCodable { var name: String = "" func didFinishMapping() { } }5. 自定义解析key
这个情况下,需要较大的工作量,处理自定义解析策略。分为两种情况:忽略某些key的映射和自定义key的映射。
HandyJSON
struct HandyModel: HandyJSON { var name: String = "" var age: Int? var ignoreKey: String = "忽略的key" mutating func mapping(mapper: HelpingMapper) { mapper <<< self.name <-- ["nick_name", "realName"] mapper <<< self.age <-- "self_age" mapper >>> self.ignoreKey } }SmartCodable
struct SmartModel: SmartCodable { var name: String = "" var age: Int? var ignoreKey: String = "忽略的key" enum CodingKeys: CodingKey { case name case age // case ignoreKey } static func mappingForKey() -> [SmartKeyTransformer]? { [ CodingKeys.name <--- ["nick_name", "realName"], CodingKeys.age <--- "self_age" ] } }6. 解析Any
在Any的解析中,HandyJSON可以无障碍的解析Any。但是SmartCodable需要借助SmartAny类型解析。
HandyJSON
struct HandyModel: HandyJSON { var name: Any? var dict: [String: Any] = [:] } guard let handyModel = HandyModel.deserialize(from: dict) else { return } print(handyModel.name) print(handyModel.dict)SmartCodable
struct SmartModel: SmartCodable { @SmartAny var name: Any? @SmartAny var dict: [String: Any] = [:] } guard let smartModel = SmartModel.deserialize(from: dict) else { return } print(smartModel.name) print(smartModel.dict)7. 处理继承关系
HandyJSON可以无障碍的支持解析继承关系。但是SmartCodable需要手动处理继承关系的解析。
HandyJSON
class HandyBaseModel: HandyJSON { var name: String? required init() { } } class HandyModel: HandyBaseModel { var age: Int? }SmartCodable
class BaseModel: SmartCodable { var name: String? required init() { } } @SmartSubclass class HandyModel: BaseModel { var age: Int? }8. 枚举的解析
需要做一定的兼容。
HandyJSON
enum HandySex: String, HandyJSONEnum { case man case women } struct HandyModel: HandyJSON { var sex: HandySex = .man }SmartCodable
enum SmartSex: String, SmartCaseDefaultable { case man case women } struct SmartModel: SmartCodable { var sex: SmartSex = .man }如何开始使用SmartCodable?
要开始使用SmartCodable,首先需要克隆仓库:
git clone https://gitcode.com/gh_mirrors/smar/SmartCodable然后按照项目中的示例和文档进行集成。项目提供了丰富的示例代码,位于Example/SmartCodable/平替HandyJSON/目录下,展示了如何将HandyJSON的各种用法迁移到SmartCodable。
通过这份指南,你可以轻松地将项目从HandyJSON迁移到SmartCodable,享受更安全、更高效的数据解析体验。如果本项目对你有帮助,欢迎支持开源项目的持续发展。
【免费下载链接】SmartCodableSmartCodable is a data parsing library built on Swift’s Codable, designed for simple usage and strong real-world compatibility. It gracefully handles missing fields, default values, and evolving JSON structures. SmartCodable 是基于 Swift Codable 的数据解析库,主打简单易用与真实业务场景下的强兼容性,能够优雅应对不断变化的 JSON 数据。项目地址: https://gitcode.com/gh_mirrors/smar/SmartCodable
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考