iOS

How to parse JSON with Swift

We’ll look at how to parse a JSON array that we could use to display a list of items in a table view. More spefically, we’ll use the following JSON (copied and tweaked from David Owens II) to display a list of blog titles in our app.

{

    "blogs": [

        {

            "needspassword": true,

            "id": 73,

            "url": "http://remote.bloxus.com/",

            "name": "Bloxus test"

        },

        {

            "needspassword": false,

            "id": 74,

            "url": "http://flickrtest1.userland.com/",

            "name": "Manila Test"

        }

    ],

    "stat": "ok"

}

Assuming we’ve made a request and received the JSON above, we just need to ask NSJSONSerialization to give us a JSON object, and then pull out the “blogs” and “name” keys. First, take a look at the full code, then we’ll break it down and explain it in smaller pieces:

var names = [String]()

 

do {

    let json = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments)

 

    if let blogs = json["blogs"] as? [[String: AnyObject]] {

        for blog in blogs {

            if let name = blog["name"] as? String {

                names.append(name)

            }

        }

    }

} catch {

    print("error serializing JSON: \(error)")

}

 

print(names) // ["Bloxus test", "Manila Test"]


Let’s break down what’s actually happening here.

First of all, everything is surrounded in a do/catch block since JSONObjectWithData:options: may throw an error. If you’re familiar with Objective-C, you’ll notice that we don’t pass in an NSError pointer here – instead, JSONObjectWithData is marked with throws, meaning it may throw an error. The error that we catch (which is called error by default) replaces the NSError pointer from Objective-C.

if let blogs = json["blogs"] as? [[String: AnyObject]] {



    // if we get "blogs" from the JSON

    // AND we can cast it to an array of dictionaries

    // then this code will execute

}


Here, we’re attempting to take "blogs" from the JSON, cast it to an array of dictionaries ([[String: AnyObject]]), and assign it to a constant called blogs. If all of that is successful, our if block will execute. (Aside: this if let syntax is called optional binding, and you need to understand it if you’re writing Swift.

Moving on:

for blog in blogs {

    if let name = blog["name"] as? String {

        names.append(name)

    }

}

Here, we’re iterating through our array of blogs, and we know that blog is a dictionary of type [String: AnyObject] based on the type of our blogs array. Inside the forloop, we’re doing optional binding again to grab the name of the blog as a String, then appending it to our names array.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s