CocoaPods trunk is moving to be read-only. Read more on the blog, there are 14 months to go.
| TestsTested | ✗ |
| LangLanguage | SwiftSwift |
| License | MIT |
| ReleasedLast Release | Apr 2015 |
| SPMSupports SPM | ✗ |
Maintained by Brad Hilton.
Magical Swift JSON Modeling Framework
Working with JSON in Swift can be a pain. But it doesn’t have to be. JsonObject makes initializing your Swift class from a JSON dictionary a breeze and let’s you easily serialize it back!
Let’s say you have some JSON like this:
{"id":"1025", "name":"Tom", "state":"CA"}Just create a subclass of JsonObject like so:
class User: JsonObject {
var id: NSNumber?
var name: String?
var state: String?
}Now initializing our model with a JSON dictionary representation is a piece of cake:
let jsonDictionary = (A NSDictionary representation of your JSON Data)
if let user = User(dictionary: jsonDictionary) {
(Do something with your new user)
}Converting your user back into a JSON dictionary is also super easy:
let jsonDictionary = user.dictionaryThat was easy.
JsonObject is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'JsonObject'
There are three different ways to specify your properties: default, optional or required.
1) Default: If you set your property with a default value and your JSON data doesn’t have that property, then your default value will remain as you specify.
2) Optional: If you declare an optional property then it may or may not have a value after you initialize your model.
3) Required: If you declare an implicitly unwrapped property, then JsonObject will make sure that your property has a value when initializing, or the initialization will fail. This keeps your models safe and makes it easy to specify which fields are required.
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 failNot all types can be set as optional or required types because of the way key-value coding works. See list below for supported Swift types:
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 requiredAll NSObject subclasses (such as NSNumber, NSString, NSArray, etc.) can be represented as default, optional or required properties.
Often JSON Data is represented in underscore case like so:
{
"member_id":"30495",
"is_public":true,
"account_balance":523.22
}But we’d like our model to use camel case like this:
class User: JsonObject {
var memberId: NSNumber!
var isPublic: Bool = false
var accountBalance: Float = 0.0
}To have JsonObject automatically map underscore properties to camel case, we just implement this protocol:
class User: JsonObject, MapsUnderscoreCaseToCamelCase {
var memberId: NSNumber!
var isPublic: Bool = false
var accountBalance: Float = 0.0
}That was easy.
To support mapping of JSON values to your object properties and back, there is a protocol, JsonMapper:
protocol JsonMapper {
func propertyValueFromJsonValue(value: JsonValue) -> AnyObject?
func jsonValueFromPropertyValue(value: AnyObject) -> JsonValue?
}JSON values are represented by the enum, JsonValue:
enum JsonValue {
case String(NSString)
case Number(NSNumber)
case Array(NSArray)
case Dictionary(NSDictionary)
case Null(NSNull)
}JsonObject comes with default mappers for the most commonly used types:
Int
Float
Double
Bool
String
Array
Dictionary
NSNumber
NSString
NSArray
NSDictionary
JsonObjectYour objects can include any of these properties, including other JsonObjects like so:
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 is available under the MIT license. See the LICENSE file for more info.