目录
一、基本使用:
二、类型转换
三、嵌套对象的映射:
现在平台与手机交互数据一般都使用xml或json格式,json数据因为格式简单、便于操作、高效率使用偏多。在iOS开发里面,因为是面向对象语言,所以基本以Model处理数据。今天就给大家介绍下swift里面的一个json与model互相转换的类:ObjectMapper
版本:iOS8.0+ swift4
ObjectMapper提供了一个协议
public protocol BaseMappable {
/// This function is where all variable mappings should occur. It is executed by Mapper during the mapping (serialization and deserialization) process.
mutating func mapping(map: Map)
}
public protocol Mappable: BaseMappable {
/// This function can be used to validate JSON prior to mapping. Return nil to cancel mapping at this point
init?(map: Map)
}
只要实现了Mappable就可以实现model和json的相互解析,例子:
struct Student : Mappable{
var name : String = ""
var age : Int = 0
var grade:GradeType = .pass
init?(map: Map) {
}
mutating func mapping(map: Map) {
name <- map["name"]
age <- map["age"]
grade <- map["grade"]
}
}
enum GradeType : Int{
case excellent = 0,good,pass,fail //优良中差
}
其中<-为objectmapper提供的转换自定义对应符号,支持枚举、常用基本类型
转换方法:
let json = "{\"name\":\"12\",\"age\":23,\"grade\":0}"
let student = Mapper().map(JSONString: json)//json转模型
let json3 = Mapper().toJSONString(student!)//模型转son
此外还支持实现Mappable协议的模型、数组、泛型的嵌套使用:
class Course : Mappable{
var teacher : Teacher?
var stus : [Student]?
var teacherID : String?
var test : T?
required convenience init?(map: Map) {
self.init()
}
func mapping(map: Map) {
teacher <- map["teacher"]
stus <- map["stus"]
teacherID <- map["teacher.id"]
test <- map["test"]
}
}
其他的还有字典、数组的就不一一举例了。
有时候平台数据类型需要和业务模型类型不一致,这时候可以直接在实现转换的协议部分处理,不需要单独处置:
转换方式: grade <- (map["grade"], transform) //在Mapping方法里面右边用元祖表示,右边第一个参数为要解析字段,第二个参数为实现TransformType协议的转换方式实体
TransformOf 为objectMapper实现TransformType协议的一个实体,简单的可以直接调用,例子:
class StudentModel : Mappable{
var id : String = ""
var name : String = ""
var age : Int = 0
var grade:GradeType?
private let transform = Transformsss()
required convenience init?(map: Map) {
self.init()
}
func mapping(map: Map) {
name <- map["name"]
age <- map["age"]
grade <- (map["grade"], transform)
id <- map["id"]
// id <- (map["age"],TransformOf(fromJSON: {String($0 ?? 0)}, toJSON: {Int($0 ?? "0")}))。 //String : 转换结果类型,Int:要转换的类型及json里面类型。fromjson:json数据转成需要数据的方式,toJSON,模型转json的方式
}
}
class Transformsss : TransformType{
typealias Object = GradeType
typealias JSON = Int
private var val : Int = 0
init() {
print("")
}
func transformFromJSON(_ value: Any?) -> Object?{
guard let intValue = value as? Int else{
print("map transform Error file = \(#file), func = \(#function), line = \(#line)")
return nil
}
val = intValue
switch val {
case 0 ..< 60:
return .fail
case 60 ..< 80:
return .pass
case 80 ..< 90:
return .good
case 90 ..< 100:
return .excellent
default:
return nil
}
}
func transformToJSON(_ value: Object?) -> JSON?{
return val
}
}
enum GradeType{
case excellent,good,pass,fail //优良中差
}
调用方式:
let json = "{\"name\":\"12\",\"age\":23,\"grade\":87}"
let model = Mapper().map(JSONString: json)
let json2 = Mapper().toJSONString(model!)
可以通过点的方式来获取更深层的数据:
teacherID <- map["teacher.id"] //获取teacher节点下id节点对应的类容
若果本身节点就包含点,为了区分提供了个标记
teacherID <- map["teacher.id", nested: false] //获取teacher.id节点下的内容
四、其他
后面我将会发布有关objectMapper和Alamofire、Realm的搭配使用。