测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布最后发布 | 2017年2月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Sebastian Gomez Osorio 维护。
SwiftModelMapper 是一个专门为 iOSSwift 编写的令人愉快的库。它以高标准的质量构建,以快速且安全地将字典解析为模型。
为您的下一个项目选择 SwiftModelMapper,或将现有项目迁移,我们保证您一定会为此感到高兴!
首先,您需要在 AppDelegate 或其它的文件里导入 SwiftModelMapper。
import SwiftModelMapper
SwiftModelMapper 是 NSObject 的扩展,所有您需要做的只是创建一个新对象,并将字典转换到任何类。
让我们假设你有以下 JSON:
{
"name": "Brian",
"age": 26,
"height": 1.75,
"isOld": true,
"user_email": "[email protected]",
"mobile_number": "567-876-2343",
"address": {
"street": "Columbus",
"avenue": 12
},
"anyDictionary": {
"key": 2
},
"arrayAnyTypes": [1, 2, 3, 4, 5],
"modelsArray": [{
"street": "sabaneta",
"avenue": 12
}, {
"street": "sabaneta",
"avenue": 13
}]
}
您的 User 模型看起来像这样:
class User: NSObject {
var name: String?
var age: NSNumber?
var height: NSNumber!
var isOld: Bool = false
var email: String?
var cellphone: String?
var address: Address?
var anyDictionary: [String:Int]?
var arrayAnyTypes: [Int]?
var modelsArray: [Address]?
}
如你所见,这个模型有一个叫做 address 的属性,这个属性是类型为 Address 的类,类如下所示:
class Address : NSObject {
var street: String?
var avenue: NSNumber?
}
您需要使用任何 JSON 解析器将此 NSString 转换为 NSDictionary 表示形式
var error: NSError?
var data = jsonData.dataUsingEncoding(NSUTF8StringEncoding)
do{
var dataDictionary: NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
} catch {
}
之后,您需要创建一个对象,并调用‘fromDictionary’函数传递参数中的字典
let user = User()
user.fromDictionary(dataDictionary)
然后您可以使用模型属性和函数。
print(user.name!)
print(user.address!.street!)
假设您有一个这样的字典数组:
let array = [["street":"sabaneta","avenue":12], ["street":"sabaneta","avenue":13]]
您可以通过简单地调用 'fromJsonArray’ 函数,并将数组作为参数传递,以简单的方式获得一个模型数组。
let modelsArray: [Address] = Address.fromJsonArray(array)
要使用 'fromJsonArray’ 函数,您不需要实例化类,只需从您的模型类中调用它即可。
如果您的JSON有任何一个键与模型属性名不匹配,您可以在模型中覆盖 'customKeysName’ 函数,将此键映射到属性。您必须返回一个包含模型属性名和 json 中将接收的名称的字典。
override func customKeysName() -> [String : String]? {
let customs = [
"email": "user_email",
"cellphone": "mobile_number"
]
return customs
}
相同的过程,但您必须使用 'fromJSON’ 函数。
do{
let jsonString = "{\"name\": \"Jose\",\"age\": 25,\"address\": {\"street\": \"Cupertino\",\"avenue\": 15},\"height\": 1.64,\"isMan\": true,\"anyDictionary\": {\"key\": 2},\"arrayAnyTypes\": [1, 2, 3, 4, 5],\"modelsArray\": [{\"street\": \"Medellín\",\"avenue\": 10}, {\"street\": \"Medellín\",\"avenue\": 11}]}"
let userJ = User()
try userJ.fromJSON(jsonString)
print("name: \(userJ.name!), address: Street \(userJ.address!.street!) Avenue \(userJ.address!.avenue!)")
} catch {
print("The string isn't a valid JSON")
}
必须使用 try catch 块来执行错误处理。
如果您的模型和子模型是 NSObject 的扩展
class User: NSObject {
var name: String?
var age: NSNumber?
var height: NSNumber!
var isMan: Bool = false
var address: Address?
var anyDictionary: [String:Int]?
var arrayAnyTypes: [Int]?
var modelsArray: [Address]?
}
class Address: NSObject {
var street: String?
var avenue: NSNumber?
init(street: String, avenue: NSNumber) {
super.init()
self.street = street
self.avenue = avenue
}
}
并且已经初始化
let homeAddress = Address(street: "Columbus", avenue: 12)
let workAddress = Address(street: "Sabaneta", avenue: 13)
let marketAddress = Address(street: "Cupertino", avenue: 15)
let user = User()
user.name = "Brian"
user.age = 26
user.address = homeAddress
user.height = 1.75
user.isMan = true
user.anyDictionary = ["key": 2]
user.arrayAnyTypes = [1, 2, 3, 4, 5]
user.modelsArray = [workAddress, marketAddress]
从您的模型创建字典非常简单
let myDictionary: [String: AnyObject] = user.toDictionary()
相同的过程,但您必须使用 'fromJSON’ 函数。
do {
let jsonString = try user.toJSON()
print("toJSON: " + jsonString)
} catch {
print("The model can't be parsed to JSON format")
}
Sebastián Gómez Osorio, Leonardo Armero Barbosa
ContactsManager 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。