How to serialize or convert Swift objects to JSON?
In Swift 4, you can inherit from the Codable
type.
struct Dog: Codable { var name: String var owner: String}// Encodelet dog = Dog(name: "Rex", owner: "Etgar")let jsonEncoder = JSONEncoder()let jsonData = try jsonEncoder.encode(dog)let json = String(data: jsonData, encoding: String.Encoding.utf16)// Decodelet jsonDecoder = JSONDecoder()let secondDog = try jsonDecoder.decode(Dog.self, from: jsonData)
Along with Swift 4 (Foundation) now it is natively supported in both ways, JSON string to an object - an object to JSON string. Please see Apple's documentation here JSONDecoder() and here JSONEncoder()
JSON String to Object
let jsonData = jsonString.data(using: .utf8)!let decoder = JSONDecoder()let myStruct = try! decoder.decode(myStruct.self, from: jsonData)
Swift Object to JSONString
let encoder = JSONEncoder()encoder.outputFormatting = .prettyPrintedlet data = try! encoder.encode(myStruct)print(String(data: data, encoding: .utf8)!)
You can find all details and examples here Ultimate Guide to JSON Parsing With Swift 4
UPDATE: Codable
protocol introduced in Swift 4 should be sufficient for most of the JSON
parsing cases. Below answer is for people who are stuck in previous versions of Swift and for legacy reasons
- This works of reflection principle. This takes less code and also supports
NSDictionary
,NSCoding
,Printable
,Hashable
andEquatable
Example:
class User: EVObject { # extend EVObject method for the class var id: Int = 0 var name: String = "" var friends: [User]? = [] } # use like below let json:String = "{\"id\": 24, \"name\": \"Bob Jefferson\", \"friends\": [{\"id\": 29, \"name\": \"Jen Jackson\"}]}" let user = User(json: json)
- Another way is by using ObjectMapper. This gives more control but also takes a lot more code.
Example:
class User: Mappable { # extend Mappable method for the class var id: Int? var name: String? required init?(_ map: Map) { } func mapping(map: Map) { # write mapping code name <- map["name"] id <- map["id"] } } # use like below let json:String = "{\"id\": 24, \"name\": \"Bob Jefferson\", \"friends\": [{\"id\": 29, \"name\": \"Jen Jackson\"}]}" let user = Mapper<User>().map(json)