Swift Language Reading & Writing JSON Simple JSON parsing into custom objects


Even if third-party libraries are good, a simple way to parse the JSON is provided by protocols You can imagine you have got an object Todo as

struct Todo {
    let comment: String

Whenever you receive the JSON, you can handle the plain NSData as shown in the other example using NSJSONSerialization object.

After that, using a simple protocol JSONDecodable

typealias JSONDictionary = [String:AnyObject]
protocol JSONDecodable {
    associatedtype Element
    static func from(json json: JSONDictionary) -> Element?

And making your Todo struct conforming to JSONDecodable does the trick

extension Todo: JSONDecodable {
    static func from(json json: JSONDictionary) -> Todo? {
        guard let comment = json["comment"] as? String else { return nil }
        return Todo(comment: comment)

You can try it with this json code:

    "todos": [
            "comment" : "The todo comment"

When you got it from the API, you can serialize it as the previous examples shown in an AnyObject instance. After that, you can check if the instance is a JSONDictionary instance

guard let jsonDictionary = dictionary as? JSONDictionary else { return }

The other thing to check, specific for this case because you have an array of Todo in the JSON, is the todos dictionary

guard let todosDictionary = jsonDictionary["todos"] as? [JSONDictionary] else { return }

Now that you got the array of dictionaries, you can convert each of them in a Todo object by using flatMap (it will automatically delete the nil values from the array)

let todos: [Todo] = todosDictionary.flatMap { Todo.from(json: $0) }