Swift 4 introduces a new Codable
protocol that lets you serialize and deserialize custom data types without writing any special code and without having to worry about losing your value types. 🎉
Awesome, isn't it? And this library helps you write less code! It's an extension for Alamofire
that converts JSON
data into Decodable
object.
- Encoding and Decoding Custom Types - Article by Apple
- Using JSON with Custom Types - Swift Playground
- Also there is a special session from
WWDC2017
that covers this new feature - What's New in Foundation
Let's decode a simple json file:
{
"result": {
"libraries": [
{
"name": "Alamofire",
"stars": 23857,
"url": "https://github.com/Alamofire/Alamofire",
"random_date_commit": 1489276800
},
{
"name": "RxSwift",
"stars": 9600,
"url": "https://github.com/ReactiveX/RxSwift",
"random_date_commit": 1494547200
}
]
}
}
with the following Swift model:
private struct Repo: Decodable {
let name: String
let stars: Int
let url: URL
let randomDateCommit: Date
private enum CodingKeys: String, CodingKey {
case name
case stars
case url
case randomDateCommit = "random_date_commit"
}
}
There is a similar method to responseData
, responseJSON
- responseDecodableObject
:
func responseDecodableObject<T: Decodable>(queue: DispatchQueue? = nil, keyPath: String? = nil, decoder: JSONDecoder = JSONDecoder(), completionHandler: @escaping (AFDataResponse<T>) -> Void)
queue
- The queue on which the completion handler is dispatched.keyPath
- The keyPath where object decoding should be performed.decoder
- The decoder that performs the decoding of JSON into semanticDecodable
type.
let url = URL(string: "https://raw.githubusercontent.com/otbivnoe/CodableAlamofire/master/keypathArray.json")!
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .secondsSince1970 // It is necessary for correct decoding. Timestamp -> Date.
AF.request(url).responseDecodableObject(keyPath: "result.libraries", decoder: decoder) { (response: AFDataResponse<[Repo]>) in
let repo = response.value
print(repo)
}
- For array:
DataResponse<[Repo]>
- For single object:
DataResponse<Repo>
- Swift 4+
- Xcode 9+
CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It has over eighteen thousand libraries and can help you scale your projects elegantly. You can install it with the following command:
$ sudo gem install cocoapods
To integrate CodableAlamofire, simply add the following line to your Podfile
:
target 'Test' do
use_frameworks!
pod 'CodableAlamofire'
end
Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.
You can install Carthage with Homebrew using the following command:
$ brew update
$ brew install carthage
To integrate CodableAlamofire into your Xcode project using Carthage, specify it in your Cartfile
:
github "Otbivnoe/CodableAlamofire"
Run carthage update
to build the framework and drag the built CodableAlamofire.framework
into your Xcode project.