神奇的Swift JSON建模框架
在Swift中处理JSON可能会有点痛苦。但是,并不一定。JsonObject可以使您轻松地从JSON字典中初始化Swift类,同时也允许您轻松地将其序列化返回!
让我们假设您有一些如下所示的JSON
{"id":"1025", "name":"Tom", "state":"CA"}
只需创建一个类似于以下内容的JsonObject的子类
class User: JsonObject {
var id: NSNumber?
var name: String?
var state: String?
}
现在只要用JSON字典表示初始化我们的模型,就是小菜一碟
let jsonDictionary = (A NSDictionary representation of your JSON Data)
if let user = User(dictionary: jsonDictionary) {
(Do something with your new user)
}
将您的用户对象转换为JSON字典也是非常容易的
let jsonDictionary = user.dictionary
很简单。
JsonObject可以通过CocoaPods获取。要安装它,只需将以下行添加到您的Podfile中
pod 'JsonObject'
有三种不同的方式来指定您的属性:默认、可选或必需。
1) 默认:如果您使用默认值设置属性,并且JSON数据没有该属性,则您的默认值将保持您指定的状态。
2) 可选:如果您声明一个可选属性,则在初始化模型后,它可能具有值或没有值。
3) 必需:如果您声明一个隐式解包的属性,则JsonObject将确保初始化时属性有时间,否则初始化将失败。这使您的模型更加安全,并且可以轻松指定哪些字段是必需的。
var defaultString: String = "Hello World" // This string will always have a value with the default being 'Hello World'
var optionalString: String? // This may or may not have a value after initalization
var requiredString: String! // If this property can't be set, then initialization will fail
由于键值编码的工作方式,并非所有类型都可以设置为可选或必需类型。下面列出支持的Swift类型列表
Int // default only
Float // default only
Double // default only
Bool // default only
String // default, optional or required
Array // default, optional or required
Dictionary // default, optional or required
所有NSObject子类(如NSNumber、NSString、NSArray等)都可以表示为默认、可选或必需属性。
通常JSON数据以下划线方式表示,如下所示
{
"member_id":"30495",
"is_public":true,
"account_balance":523.22
}
但我们会希望我们的模型使用camel案,如下所示
class User: JsonObject {
var memberId: NSNumber!
var isPublic: Bool = false
var accountBalance: Float = 0.0
}
为了使JsonObject自动将下划线属性映射到camel案,我们只需实现此协议
class User: JsonObject, MapsUnderscoreCaseToCamelCase {
var memberId: NSNumber!
var isPublic: Bool = false
var accountBalance: Float = 0.0
}
很简单。
为了支持将JSON值映射到对象属性和反向映射,有一个协议,JsonMapper
protocol JsonMapper {
func propertyValueFromJsonValue(value: JsonValue) -> AnyObject?
func jsonValueFromPropertyValue(value: AnyObject) -> JsonValue?
}
JSON值由枚举JsonValue表示
enum JsonValue {
case String(NSString)
case Number(NSNumber)
case Array(NSArray)
case Dictionary(NSDictionary)
case Null(NSNull)
}
JsonObject为最常见的类型提供了默认映射器
Int
Float
Double
Bool
String
Array
Dictionary
NSNumber
NSString
NSArray
NSDictionary
JsonObject
您的对象可以包括以下任何属性,包括其他JsonObject,如下所示
class User: JsonObject {
var id: Int = 0
var name: String!
var isPublic: Bool = false
var isMember: Bool = false
var accountBalance: Float = 0.00
var ranking: NSNumber!
var spouse: User?
var friends: [User]?
var metadata: [String:[NSNumber]]?
}
Brad Hilton, [email protected]
JsonObject遵循MIT许可证。有关更多信息,请参阅LICENSE文件。