从HandyJSON迁移到SmartCodable:无缝过渡的完整指南
2026/7/25 22:43:46 网站建设 项目流程

从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核心功能对比

序号特性特性说明SmartCodableHandyJSON
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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询