22,918
stars
+-4+-7+-12
3,413
forks
–
watchers
–
prs
–
issues
–
releases
–
discussions
README
SwiftyJSON
!CocoaPods !Platform
SwiftyJSON makes it easy to deal with JSON data in Swift.
1. Why is the typical JSON handling in Swift NOT good
2. Requirements
3. Integration
4. Usage
- Initialization
- Subscript
- Loop
- Error
- Optional getter
- Non-optional getter
- Setter
- Raw object
- Literal convertibles
- Merging
- Removing elements
5. Work with Alamofire
6. Work with Moya
7. SwiftyJSON Model Generator
Why is the typical JSON handling in Swift NOT good?
Swift is very strict about types. But although explicit typing is good for saving us from mistakes, it becomes painful when dealing with JSON and other areas that are, by nature, implicit about types.
Take the Twitter API for example. Say we want to retrieve a user's "name" value of some tweet in Swift (according to Twitter's API).
The code would look like this:
swift
if let statusesArray = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [[String: Any]],
let user = statusesArray[0]["user"] as? [String: Any],
let username = user["name"] as? String {
// Finally we got the username
}
It's not good.
Even if we use optional chaining, it would be messy:
swift
if let JSONObject = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [[String: Any]],
let username = (JSONObject[0]["user"] as? [String: Any])?["name"] as? String {
// There's our username
}
An unreadable mess--for something that should really be simple!
With SwiftyJSON all you have to do is:
swift
let json = try? JSON(data: dataFromNetworking)
if let userName = json[0]["user"]["name"].string {
//Now you got your value
}
And don't worry about the Optional Wrapping thing. It's done for you automatically.
swift
let json = try? JSON(data: dataFromNetworking)
let result = json[999999]["wrong_key"]["wrong_name"]
if let userName = result.string {
//Calm down, take it easy, the ".string" property still produces the correct Optional String type with safety
} else {
//Print the error
print(result.error)
}
Requirements
- iOS 8.0+ | macOS 10.10+ | tvOS 9.0+ | watchOS 2.0+
- Xcode 16+
- Swift 6.0+
Integration
CocoaPods (iOS 8+, OS X 10.9+)
You can use CocoaPods to install SwiftyJSON by adding it to your Podfile:
ruby
platform :ios, '8.0'
use_frameworks!
target 'MyApp' do
pod 'SwiftyJSON', '~ 4.0'
end
Carthage (iOS 8+, OS X 10.9+)
You can use Carthage to install SwiftyJSON by adding it to your Cartfile:
github "SwiftyJSON/SwiftyJSON" ~ 4.0
If you use Carthage to build your dependencies, make sure you have added SwiftyJSON.framework to the "Linked Frameworks and Libraries" section of your target, and have included them in your Carthage framework copying build phase.
Swift Package Manager
You can use The Swift Package Manager to install SwiftyJSON by adding the proper description to your Package.swift file:
swift
// swift-tools-version:4.0
import PackageDescription
let package = P