Swift 中的单行 JSON 序列化和反序列化是我的强项。
依赖 JSONHelper 且为与 Alamofire 结合使用而设计。
JSONJam 通过 CocoaPods 提供使用。要安装它,请简单地将以下行添加到您的 Podfile 中
platform :ios, '8.0'
use_frameworks!
pod "JSONJam", :git => 'https://github.com/mluedke2/jsonjam.git'
在您的 Swift 模型类中
JSONJam
propertyMap()
并将您的 JSON 键映射到相关参数(以引用的形式传递参数)示例
import JSONJam
public class User: JSONJam {
public var name: String?
public var favoriteNumber: Int?
override public func propertyMap() {
map("name", string: &name)
map("favorite_number", int: &favoriteNumber)
}
}
您可以将自定义对象准备为以下 JSON 格式
// singular
customObject.parameterize()
// plural
customObjects.parameterize()
Alamofire 中的示例
Alamofire.request(.POST, baseURL + "/customObjects", parameters: customObject.parameterize(), encoding: .JSON)
您可以将 JSON 对象和数组转换为以下自定义对象
// singular
var customObject: CustomObject?
customObject <-- JSON
// plural
var customObjects: [CustomObject]?
customObjects <-- JSON
Alamofire 示例(在示例网络控制器中)
func getCustomObjects(success:([CustomObject]) -> Void, fail:NetworkError) -> Void {
Alamofire.request(.GET, baseURL + "/customObjects")
.responseJSON {(request, response, JSON, error) in
switch error {
case .Some(let error):
fail(error)
case .None:
var customObjects: [CustomObject]?
customObjects <-- JSON
if let customObjects = customObjects {
success(customObjects)
} else {
// JSON parsing error
}
}
}
}
要运行示例项目,请克隆仓库,并在 Example
目录中运行 pod install
。它包含测试! :]
提供与您的 NSDate
(或数组)一起的日期格式字符串,它将在序列化和反序列化中使用
import JSONJam
class MyObject: JSONJam {
var dateFormat = "yyyy-MM-dd HH:mm:ss"
var creationDate: NSDate?
var transactionDates: [NSDate]?
override func propertyMap() {
map("creation_date", date: &creationDate, dateFormat: dateFormat)
map("transaction_dates", dateArray: &transactionDates, dateFormat: dateFormat)
}
}
您可以为特定参数重写序列化和反序列化,并为此工作提供闭包。
这对于枚举来说非常有用,例如在示例项目中 ShoeSize
import JSONJam
class ShoeSize: JSONJam {
enum SizeSystem: String {
case UnitedStates = "US"
case Europe = "EUR"
case UnitedKingdom = "UK"
case Australia = "AUS"
}
var size: Int?
var sizeSystem: SizeSystem?
override func propertyMap() {
map("size", int: &size)
map("system",
serializeClosure:{ (inout outgoingParameter: AnyObject?) -> Void in
outgoingParameter = self.sizeSystem?.rawValue as AnyObject?
},
deserializeClosure: { (data: String?) -> Void in
if let data = data {
self.sizeSystem = SizeSystem(rawValue: data)
}
}
)
}
}
mluedke2, [email protected]
JSONJam 使用 MIT 许可证。有关更多信息,请参阅 LICENSE 文件。