HandyJSON Tip

HandyJSON使用Tip

HandyJSON描述

HandyJSON是alibaba公司开源的一个映射json数据到对象的一个Swift语言库. 其特点是直接操作内存来完成给对象赋值。没有使用KVC特性,不需要对象继承NSObject类。

常见用法

让class、struct、enum直接实现HandyJSON协议。
HandyJSON里面只有一个无参数的init方法。

HandyJSON赋值不触发属性的KVO方法

因为HandyJSON是直接操作内存赋值的,所以对象的KVO方法不会被调用。也就是所willSet, didSet方法不会被触发。所以依赖KVO的属性需要映射后特别处理。
复杂属性的映射

对象属性名和json属性不一致的映射 (文档有示例)
属性名一致但值需要转换 (文档有示例)
属性名不一致需要转换 (估计比较少见,文档无示例)

下面举一个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//json: "{"name", "Erik Lu", "age": "25", "liking": "swimming,chess,climing"}"
class User: HandyJSON {
var username: String
var age: Int = 20
var hobby: [String] = []
require init() {
}
func mapping(mapper: HelpingMapper) {
//对象属性名和json属性不一致的映射
mapper <<<
self.username <-- "name"
//属性名一致但值需要转换
mapper <<<
self.age <-- TransformOf<Int, String>(fromJSON: { (str) -> Int? in
return Int(str) ?? 20
}, toJSON: { (age) -> String? in
return "\(age ?? 20)"
})
//属性名不一致需要转换
mapper <<<
self.lstTag <-- ("liking", TransformOf<[String], String>(fromJSON: { (str) -> [String]? in
if str == nil {
return []
}else {
return str!.components(separatedBy: [","])
}
}, toJSON: { (hobby) -> String? in
return hobby?.joined(separator: ",")
}))
}
}