How to convert a JSON string to a dictionary? How to convert a JSON string to a dictionary? json json

How to convert a JSON string to a dictionary?


Warning: this is a convenience method to convert a JSON string to a dictionary if, for some reason, you have to work from a JSON string. But if you have the JSON data available, you should instead work with the data, without using a string at all.

Swift 3

func convertToDictionary(text: String) -> [String: Any]? {    if let data = text.data(using: .utf8) {        do {            return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]        } catch {            print(error.localizedDescription)        }    }    return nil}let str = "{\"name\":\"James\"}"let dict = convertToDictionary(text: str)

Swift 2

func convertStringToDictionary(text: String) -> [String:AnyObject]? {    if let data = text.dataUsingEncoding(NSUTF8StringEncoding) {        do {            return try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String:AnyObject]        } catch let error as NSError {            print(error)        }    }    return nil}let str = "{\"name\":\"James\"}"let result = convertStringToDictionary(str)

Original Swift 1 answer:

func convertStringToDictionary(text: String) -> [String:String]? {    if let data = text.dataUsingEncoding(NSUTF8StringEncoding) {        var error: NSError?        let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.allZeros, error: &error) as? [String:String]        if error != nil {            println(error)        }        return json    }    return nil}let str = "{\"name\":\"James\"}"let result = convertStringToDictionary(str) // ["name": "James"]if let name = result?["name"] { // The `?` is here because our `convertStringToDictionary` function returns an Optional    println(name) // "James"}

In your version, you didn't pass the proper parameters to NSJSONSerialization and forgot to cast the result. Also, it's better to check for the possible error. Last note: this works only if your value is a String. If it could be another type, it would be better to declare the dictionary conversion like this:

let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.allZeros, error: &error) as? [String:AnyObject]

and of course you would also need to change the return type of the function:

func convertStringToDictionary(text: String) -> [String:AnyObject]? { ... }


I've updated Eric D's answer for Swift 5:

 func convertStringToDictionary(text: String) -> [String:AnyObject]? {    if let data = text.data(using: .utf8) {        do {            let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:AnyObject]            return json        } catch {            print("Something went wrong")        }    }    return nil}


Swift 3:

if let data = text.data(using: String.Encoding.utf8) {    do {        let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:Any]        print(json)    } catch {        print("Something went wrong")    }}