JSONMatching
在纯 Swift 中将 JSON 数据解码成 Model 对象的简单方法
要求
- iOS 8.0+
- Xcode 8
集成
CocoaPods (iOS 8+)
您可以使用 CocoaPods 将 JSONMatching
添加到您的 Podfile
以进行安装
platform :ios, '8.0'
use_frameworks!
target 'MyApp' do
pod 'JSONMatching', '~> 1.0.0'
end
手动安装 (iOS 7+)
要手动在项目中使用此库,您可能需要:
- 对项目,只需将 JSONMatching.swift 拖到项目结构中
- 对工作区,请包含整个 JSONMatching.xcodeproj
使用方法
基础
为了支持从JSON进行反序列化,一个类需要继承自'CodableObject'。
import JSONMatching
class User: CodableObject {
var name:String = ""
var age:Int = 0
var height:Double = 0
}
let dic:[String:Any] = [
"name":"jack",
"age":18,
"height":1.88,
"male":true
]
let match = JSONMatching()
if let user = match.object(type: User.self, with: dic) {
//...
}
JSONString
let jsonStr = """
{
"name": "aaa",
"age": 18,
"height": 166
}
"""
let match = JSONMatching()
if let user = match.object(type: User.self, with: jsonStr) {
//...
}
对象数组
class User: CodableObject {
var name:String = ""
var age:Int = 0
var height:Double = 0
}
let userArray:[[String:Any]] = [
["name":"jack", "age":18, "height":1.88, "male":true],
["name":"lily", "age":18, "height":1.65, "male":false],
["name":"josh", "age":30, "height":1.77, "male":true]
]
let match = JSONMatching()
if let userArr = match.objectArray(type: [User].self, with: userArray) {
//...
}
对象属性
在类中声明的对象属性应该被初始化。如果没有,可以使用'codableObjectForProperty'提供一个相对对象。
class User: CodableObject {
var name:String = ""
var age:Int = 0
var height:Double = 0
var pet:Pet = Pet()
class Pet: CodableObject {
var type:String = ""
var name:String = ""
var age:Int = 0
}
}
let dic:[String:Any] = [
"name":"jack",
"age":18,
"height":1.88,
"male":true,
"pet": [
"name":"micky",
"type":"cat",
]
]
/*
// if property 'pet' is optional, provide a relative object
match.codableObjectForProperty { (type) -> CodableObject? in
if type == Pet?.self {
return Pet()
}
return nil
}
*/
if let user = match.object(type: User.self, with: dic) {
//...
}
对象数组属性
使用'codableObjectForProperty'为类中声明的对象数组属性提供一个相对对象
class User: CodableObject {
var name:String = ""
var age:Int = 0
var height:Double = 0
var cars:[Car] = [Car]()
class Car: CodableObject {
var brand:String = ""
var color:String = ""
var price:Double = 0
}
var children:[Child]?
class Child: CodableObject {
var name:String = ""
var age:Int = 0
var male:Bool?
}
}
let match = JSONMatching()
match.codableObjectForProperty { (type) -> CodableObject? in
if type == [Car].self {
return Car()
} else if type == [Child]?.self {
return Child()
}
return nil
}
if let user = match.object(type: User.self, with: dic) {
//...
}