HandyJson
是阿里巴巴开源的一个用于Swift语言中的JSON序列化/反序列化库,可以很方便进行json与model的转换,以及常用的字典与模型的互相转换
JSON转Model
只需要在定义时,实现HandyJSON协议,这个协议只要求实现一个空的init()函数
- 定义model
class Animal: HandyJSON {
var name: String?
var id: String?
var num: Int?
required init() {} // 如果定义是struct,连init()函数都不用声明;
}
- 转换
if let animal = JSONDeserializer<Animal>.deserializeFrom(json: jsonString) {
print(animal.name)
print(animal.id)
print(animal.num)
}
指定反序列化JSON中某个节点
有时服务端返回的JSON文本包含大量的状态信息,和Model无关,比如statusCode,debugMessage等,或者有用的数据是在某个节点以下,那么我们可以指定反序列化哪个节点:
struct Cat: HandyJSON {
var id: Int64!
var name: String!
}
// 服务端返回了这个JSON,我们想解析的只有data里的cat
let jsonString = "{\"code\":200,\"msg\":\"success\",\"data\":{\"cat\":{\"id\":12345,\"name\":\"Kitty\"}}}"
// 那么,我们指定解析 "data.cat",通过点来表达路径
if let cat = JSONDeserializer<Cat>.deserializeFrom(json: jsonString, designatedPath: "data.cat") {
print(cat.name)
}
自定义解析方式
HandyJSON还提供了一个扩展能力,就是允许自行定义Model类某个字段的解析Key、解析方式
HandyJSON协议提供了一个可选的mapping()函数,我们可以在其中指定某个字段用什么Key、或者用什么方法从JSON中解析出它的值
class Cat: HandyJSON {
var id: Int64!
var name: String!
var parent: (String, String)?
required init() {}
}
let jsonString = "{\"cat_id\":12345,\"name\":\"Kitty\",\"parent\":\"Tom/Lily\"}"
可以看到,Cat类的id属性和JSON文本中的Key是对应不上的;而对于parent这个属性来说,它是一个元组,做不到从JSON中的"Tom/Lily"解析出来。所以我们要定义一个Mapping函数来做这两个支持:
class Cat: HandyJSON {
var id: Int64!
var name: String!
var parent: (String, String)?
required init() {}
func mapping(mapper: HelpingMapper) {
// 指定 id 字段用 "cat_id" 去解析
mapper.specify(property: &id, name: "cat_id")
// 指定 parent 字段用这个方法去解析
mapper.specify(property: &parent) { (rawString) -> (String, String) in
let parentNames = rawString.characters.split{$0 == "/"}.map(String.init)
return (parentNames[0], parentNames[1])
}
}
}
Model转JSON
直接调用HandyJSON的序列化方法去序列化,就能得到JSON字符串
JSONSerializer.serializeToJSON(object: xxx)