How to serialize or convert Swift objects to JSON? How to serialize or convert Swift objects to JSON? json json

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

EVReflection :

  • This works of reflection principle. This takes less code and also supports NSDictionary, NSCoding, Printable, Hashable and Equatable

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)

ObjectMapper :

  • 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)