从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/SmartCodableSmartCodable是基于Swift Codable的数据解析库主打简单易用与真实业务场景下的强兼容性能够优雅应对不断变化的JSON数据。对于正在使用HandyJSON的开发者来说迁移到SmartCodable不仅能解决HandyJSON存在的安全性问题还能获得更好的性能和更丰富的功能支持。为什么选择从HandyJSON迁移HandyJSON曾是Swift开发者常用的数据解析库但它使用Swift的反射特性来实现数据的序列化和反序列化该机制被证明是非法且不安全的。而SmartCodable基于Swift标准库的Codable协议构建提供了一种声明式的方式来进行序列化和反序列化更为通用和安全。SmartCodable与HandyJSON核心功能对比序号特性特性说明SmartCodableHandyJSON1强大的兼容性完美兼容字段缺失 字段值为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。HandyJSONimport HandyJSON class HandyModel: HandyJSON { var name: String required init() { } } struct HandyModel: HandyJSON { var name: String }SmartCodableimport SmartCodable class SmartModel: SmartCodable { var name: String required init() { } } struct SmartModel: SmartCodable { var name: String }2. 反序列化在反序列化中可以完全无障碍的平替不需要代码改动。注意使用HandyJSON解码数组时候需要使用 as? [HandyModel] 进行可选解包。SmartCodable中是不需要的当然不删除也不会报错。你可以全局搜索) as? [查找删除。HandyJSONguard let handyModel HandyModel.deserialize(from: dict) else { return } guard let handyModels [HandyModel].deserialize(from: [dict]) as? [HandyModel] else { return }SmartCodableguard let smartModel SmartModel.deserialize(from: dict) else { return } guard let smartModels [SmartModel].deserialize(from: [dict]) else { return }3. 序列化在序列化中需要少量的代码改动。需要将toJSON()替换为toDictionary()或toArray()。HandyJSONlet toDict handyModel.toJSON() let toJsonStr handyModel.toJSONString() let toArr handyModels.toJSON() let toArrStr handyModels.toJSONString()SmartCodablelet toDict1 smartModel.toDictionary() let toJsonStr1 smartModel.toJSONString() let toArr1 smartModels.toArray() let toArrStr1 smartModels.toJSONString()4. 解码完成的回调使用didFinishMapping处理解码完成时的回调。两者完全一样不需要任何替换工作量。HandyJSONstruct HandyModel: HandyJSON { var name: String func didFinishMapping() { } }SmartCodablestruct SmartModel: SmartCodable { var name: String func didFinishMapping() { } }5. 自定义解析key这个情况下需要较大的工作量处理自定义解析策略。分为两种情况忽略某些key的映射和自定义key的映射。HandyJSONstruct 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 } }SmartCodablestruct 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类型解析。HandyJSONstruct HandyModel: HandyJSON { var name: Any? var dict: [String: Any] [:] } guard let handyModel HandyModel.deserialize(from: dict) else { return } print(handyModel.name) print(handyModel.dict)SmartCodablestruct 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需要手动处理继承关系的解析。HandyJSONclass HandyBaseModel: HandyJSON { var name: String? required init() { } } class HandyModel: HandyBaseModel { var age: Int? }SmartCodableclass BaseModel: SmartCodable { var name: String? required init() { } } SmartSubclass class HandyModel: BaseModel { var age: Int? }8. 枚举的解析需要做一定的兼容。HandyJSONenum HandySex: String, HandyJSONEnum { case man case women } struct HandyModel: HandyJSON { var sex: HandySex .man }SmartCodableenum 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),仅供参考