从 JSON 到 Model: 协议默认方法让生活更简单
2016-12-25 14:54
477 查看
背景
在 从 API 生成 Model 代码开源脚本中生成的模型代码中, 我们默认生成了
init(json:JSON)方法.
假设就是如下的
UserModel
struct User{ let name:String let age:Int init(json: JSON) { self.name = json["name"].stringValue self.age = json["age"].intValue } }
我们经常需要得到的是 一个
User数组.
完善之路
也许我们会写如下的方法:func parseUsers(from data:JSON) -> [User]{ var array:[User] = [] for (index,json) in data{ array.append(User(json:json)) } return array }
上面的代码,对于 Swift 来说, 还有很大的改进空间.
首先. 我们可以简化成一行代码, 如下:
func parseUsers(from data:JSON) -> [User]{ return data.map{ User(json:$0.1) } }
够简单了吧. 使用 map 方法. 一行就 OK 了. 简单明了.
但是
终极简化
在 Swift 中我们可以一行代码都不写.就实现上面的功能.怎么实现? 答案就在神奇的默认协议实现方法上.
我们对 Model 类提取一个协议出来
如下: 很简单,就是指定模型类可以从 JSON 反序列化成 Model.
public protocol JSONDeserializable { init(json:JSON) }
声明 User 实现了 上面的协议.
extension User:JSONDeserializable{ }
因为我们实际上已经实现了. 所以我们不要额外写代码了.
为
JSONDeserializable添加一个默认协议静态方法.
用来将 JSON 数组转换成 Model 数组. 如下.
extension JSONDeserializable{ public static func objects(from json: JSON) -> [Self]{ return json.map{ Self(json:$0.1) } } }
OK 大功告成!. 现在反序列化一个 User 数组的
json只需要这样写就可以了.
let users = User.objects(from: json)
更重要 的是,所以其他的 Model 类型,只要添加实现
JSONDeserializable的声明就拥有了从 JSON 数组反序列化的能力了.
总结
至此,整个从 API 到 Model 的流程都变得无比简单,及别人愉快.使用
generate_model服务将 从 API 的 JSON 返回转化成 Model 的声明.
借助 Swift 默认协议. 简化 Model 数组的反序列化.
相关文章推荐
- 最简单的处理MVC中默认的Json方法返回时间的问题
- VB 编程中打开默认网址和 Email 的更简单的方法
- 祛痘收缩毛孔的简单方法 - 生活至上,美容至尚!
- 非常好用的JsonToString 方法 简单实例
- 让生活变得简单的60种方法
- img设置默认图片最简单的解决方法
- 一个简单的java处理json的方法
- Java语言基础(六)char成员变量默认初始值 最简单的Java源文件 Java的main()方法
- 处理MVC中默认的Json方法返回时间的问题
- ASA防火墙外部web应用端口与默认审查协议相冲突的解决方法
- JS JSON对象转为字符串的简单实现方法
- 祛痘收缩毛孔的简单方法 - 健康程序员,至尚生活!
- java手动拼接Ext组件json数据的简单方法
- 让生活变得简单的60种方法
- 非常好用的JsonToString 方法 简单实例
- 省钱有简单的祛痘方法 - 生活至上,美容至尚!
- Android中默认不输出stdout stderr,如何输出?最简单的方法
- Ext.Net 和 ExtJs 通用的CheckboxSelectionModel默认加载项 绑定方法
- JS创建JSON的简单方法
- JS JSON对象转为字符串的简单实现方法