Simple and clean way to convert JSON string to Object in Swift Simple and clean way to convert JSON string to Object in Swift ios ios

Simple and clean way to convert JSON string to Object in Swift


Here are some tips how to begin with simple example.

Consider you have following JSON Array String (similar to yours) like:

 var list:Array<Business> = []  // left only 2 fields for demo  struct Business {    var id : Int = 0    var name = ""                } var jsonStringAsArray = "[\n" +        "{\n" +        "\"id\":72,\n" +        "\"name\":\"Batata Cremosa\",\n" +                    "},\n" +        "{\n" +        "\"id\":183,\n" +        "\"name\":\"Caldeirada de Peixes\",\n" +                    "},\n" +        "{\n" +        "\"id\":76,\n" +        "\"name\":\"Batata com Cebola e Ervas\",\n" +                    "},\n" +        "{\n" +        "\"id\":56,\n" +        "\"name\":\"Arroz de forma\",\n" +                "}]"        // convert String to NSData        var data: NSData = jsonStringAsArray.dataUsingEncoding(NSUTF8StringEncoding)!        var error: NSError?        // convert NSData to 'AnyObject'        let anyObj: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(0),            error: &error)        println("Error: \(error)")     // convert 'AnyObject' to Array<Business>     list = self.parseJson(anyObj!)     //===============    func parseJson(anyObj:AnyObject) -> Array<Business>{        var list:Array<Business> = []         if  anyObj is Array<AnyObject> {            var b:Business = Business()            for json in anyObj as Array<AnyObject>{             b.name = (json["name"] as AnyObject? as? String) ?? "" // to get rid of null             b.id  =  (json["id"]  as AnyObject? as? Int) ?? 0                                list.append(b)            }// for        } // if      return list    }//func    

[EDIT]

To get rid of null changed to:

b.name = (json["name"] as AnyObject? as? String) ?? ""b.id  =  (json["id"]  as AnyObject? as? Int) ?? 0 

See also Reference of Coalescing Operator (aka ??)

Hope it will help you to sort things out,


for swift 3/4

extension String {    func toJSON() -> Any? {        guard let data = self.data(using: .utf8, allowLossyConversion: false) else { return nil }        return try? JSONSerialization.jsonObject(with: data, options: .mutableContainers)    }}

Example Usage:

 let dict = myString.toJSON() as? [String:AnyObject] // can be any type here


As simple String extension should suffice:

extension String {    var parseJSONString: AnyObject? {        let data = self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)        if let jsonData = data {            // Will return an object or nil if JSON decoding fails            return NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil)        } else {            // Lossless conversion of the string was not possible            return nil        }    }}

Then:

var jsonString = "[\n" +    "{\n" +    "\"id\":72,\n" +    "\"name\":\"Batata Cremosa\",\n" +                "},\n" +    "{\n" +    "\"id\":183,\n" +    "\"name\":\"Caldeirada de Peixes\",\n" +                "},\n" +    "{\n" +    "\"id\":76,\n" +    "\"name\":\"Batata com Cebola e Ervas\",\n" +                "},\n" +    "{\n" +    "\"id\":56,\n" +    "\"name\":\"Arroz de forma\",\n" +            "}]"let json: AnyObject? = jsonString.parseJSONStringprintln("Parsed JSON: \(json!)")println("json[3]: \(json![3])")/* Output:Parsed JSON: (    {    id = 72;    name = "Batata Cremosa";    },    {    id = 183;    name = "Caldeirada de Peixes";    },    {    id = 76;    name = "Batata com Cebola e Ervas";    },    {    id = 56;    name = "Arroz de forma";    })json[3]: {    id = 56;    name = "Arroz de forma";}*/