关于ObjectMapper
关于这个第三方库,我也是最近才接触到,在转到swift的项目当中,其实很长时间都在寻找一个适合库来做网络请求回来的JSON解析,但一直都没有找到较好的,所以之前的项目一直都是手动字典转模型,最近发现了一个轻巧又实用的库--而且再多层嵌套,也可以用几句代码完成转换,简直可以媲美OC中字典转模型的第三方框架.
Github的地址为:https://github.com/Hearst-DD/ObjectMapper
本文主要是翻译github的内容,大家如果英文阅读能力较好的可以自己翻看英文文档
基本使用方法
如果一个类或者结构体的接口实现了Mappable接口的时,便可以支持映射,然后还需要实现协议中的两个接口:
init?(_ map: Map)mutating
func mapping(map: Map)
ObjectMapper实用了一个操作符 "<-"来定义成员变量的映射和JSON的转换.
class User: Mappable {
//这里要定义好需要转换的内容相对于的字段和类型,以后日后方便赋值转换
var username: String?
var age: Int?
var weight: Double!
var array: [AnyObject]?
var dictionary: [String : AnyObject] = [:]
var bestFriend: User? // Nested User object
var friends: [User]? // Array of Users
var birthday: NSDate?
required init?(_ map: Map) {
}
// Mappable
func mapping(map: Map) {
//根据字典中的内容用"<-"操作符号来映射相应的内容,将其转换到定义好的成员变量中
username <- map["username"]
age <- map["age"]
weight <- map["weight"]
array <- map["arr"]
dictionary <- map["dict"]
bestFriend <- map["best_friend"]
friends <- map["friends"]
birthday <- (map["birthday"], DateTransform())
}
}
//结构体的话也是执行相应的操作
struct Temperature: Mappable {
var celsius: Double?
var fahrenheit: Double?
init?(_ map: Map) {
}
mutating func mapping(map: Map) {
celsius <- map["celsius"]
fahrenheit <- map["fahrenheit"]
}
}
唔,一旦你的类接口定义了Mappable,那么你这个类就可以调用简答的方法进行字典转模型的转换啦.
转换一个JSON成相应的类模型:
let user = User(JSONSting:jsonString)
转换一个模型成相应的字符串:
let jsonString = user.toJSONString(prettyPrint:true)
除了这种转换方式,Mapper.swfit类还提供了�扩展的方法也可以进行同样的转换:
// 字典转模型
let user = Mapper<User>().map(JSONString: JSONString)
//字典转模型
let JSONString = Mapper().toJSONString(user, prettyPrint: true)
ObjectMapper支持以下的数据类型
- Int
- Bool
- Double
- Float
- String
- RawRepresentable(Enums)
- Array<AnyObject>
- Dictionary<String, AnyObject>
- Object<T: Mappable>
- Array<T: Mappable>
- Array<Array<T: Mappable>>
- Set<T: Mappable>
- Dictionary<String, T: Mappable>
- Dictionary<String, Array<T: Mappable>>
- Optionals of all the above
Mappable Protocol
mutating func mapping(map: Map)
这个函数里面定义了映射所需要指向的字符串,当解析JSON的过程中,创建好实例对象以后会去执行这个函数,当生成JSON的过程中,这个函数是唯一一个可以被叫做对象.
init?(_ map: Map)
//翻译未完成,待续...其实ObjectMapper的使用非常简单,只要字符串和相对应的Object一一对应即可...