swiftyJSON与对象Model的转换
2023-03-07 09:13:35 时间
在使用SwiftyJSON做数据传输的时候,经常需要从JSON格式中取值到对象中,在开发ios应用时,对象的字段和类型通常也是固定的,如何在接口获取到数据的时候优雅的进行类型转换是一个很值得考虑的细节。
优雅不仅是在可读性上提高,同时也方便后期对于数据格式的管理维护。
否则每次做细节调整的时候,需要查找所用的工作量就不可小觑了。
在网上也有通过反射机制来实现所有类自动转换的,见参考1。逻辑上是成立的,没有仔细研究。实际测试发现无法转换(与语言版本等可能有关)。
这里我先用比较务实的方式,做一层封装。主要完成的是将JSON赋值操作,写入到对象的结构体中,这样的话我们就不用在业务流程中进行复杂的赋值操作了。
1. 设计一个用于支持JSON互转的接口
这里我设计了两种初始化的方式,实际上一种就够了 主要是调用的时候写法略有不同,且便捷初始化开销更小一点。 我个人会喜欢以函数名来区分不同的运作方式,所以额外增加了静态的fromJSON方法
protocol JSONable {
/** 便利初始化方式将对象注册为Object */
convenience init( data:JSON )
/** 静态函数方式 */
static func fromJSON( data:JSON ) -> Self
/** 将对象导出到JSON格式 */
func toJSON() -> JSON?
}
2. 模型、结构体继承并实现接口
struct Category:JSONable{
var id:String
var count:Int
var covers: [String]
convenience init( data:JSON ){
id = data["id"].stringValue
count = data["count"].intValue
covers = data["covers"].arrayValue as! [String]
}
static func fromJSON( data:JSON ){
return self.init( id: data["id"].stringValue, count: data["count"].intValue, covers: data["covers"].arrayValue as! [String] )
}
func toJSON() -> JSON?{
var j = JSON()
j["id"].string = id
j["count"].int = count
j["covers"].array = covers
}
}
3. 调用
let testJSONString = "{\"id\":\"test001\",\"count\":100,\"covers\":[\"a\",\"b\",\"c\"]}"
let testJSON = JSON.init(parseJSON: testJSONString)
// JSON转Model
// 方式1
var category = Category( data: testJSON )
// 方式2
var category = Category.fromJSON( data: testJSON )
// 转换到JSON
let jString = category.toJSON()
参考:
相关文章
- 在 Go 里用 CGO?这 7 个问题你要关注!
- 9款优秀的去中心化通讯软件 Matrix 的客户端
- 求职数据分析,项目经验该怎么写
- 在OKR中,我看到了数据驱动业务的未来
- 火山引擎云原生大数据在金融行业的实践
- OpenHarmony富设备移植指南(二)—从postmarketOS获取移植资源
- 《数据成熟度指数》报告:64%的企业领袖认为大多数员工“不懂数据”
- OpenHarmony 小型系统兼容性测试指南
- 肯睿中国(Cloudera):2023年企业数字战略三大趋势预测
- 适用于 Linux 的十大命令行游戏
- GNOME 截图工具的新旧截图方式
- System76 即将推出的 COSMIC 桌面正在酝酿大变化
- 2GB 内存 8GB 存储即可流畅运行,Windows 11 极致精简版系统 Tiny11 发布
- 迎接 ecode:一个即将推出的具有全新图形用户界面框架的现代、轻量级代码编辑器
- loongarch架构介绍(三)—地址翻译
- Go 语言怎么解决编译器错误“err is shadowed during return”?
- 敏捷:可能被开发人员遗忘的部分
- Denodo预测2023年数据管理和分析的未来
- 利用数据推动可持续发展
- 在 Vue3 中实现 React 原生 Hooks(useState、useEffect),深入理解 React Hooks 的