36

I have a json that I could parse with SwiftyJSON :

if let title = json["items"][2]["title"].string {
     println("title : \(title)")
}

Works perfectly.

But I couldn't loop through it. I tried two methods, the first one is

// TUTO :
//If json is .Dictionary
for (key: String, subJson: JSON) in json {
    ...
}
// WHAT I DID :
for (key: "title", subJson: json["items"]) in json {
    ...
}

XCode didn't accept the for loop declaration.

The second method :

// TUTO :
if let appArray = json["feed"]["entry"].arrayValue {
     ...
}
// WHAT I DID :
if let tab = json["items"].arrayValue {
     ...
}

XCode didn't accept the if statement.

What am I doing wrong ?

Cherif
  • 5,223
  • 8
  • 33
  • 54

5 Answers5

79

If you want loop through json["items"] array, try:

for (key, subJson) in json["items"] {
    if let title = subJson["title"].string {
        println(title)
    }
}

As for the second method, .arrayValue returns non Optional array, you should use .array instead:

if let items = json["items"].array {
    for item in items {
        if let title = item["title"].string {
            println(title)
        }
    }
}
rintaro
  • 51,423
  • 14
  • 131
  • 139
  • when I try looping through my dictionary of [String: JSON] I get the error: '[String : JSON]?' does not have a member named 'Generator' – mattgabor Aug 18 '15 at 20:26
  • because it's optional – nikans Dec 05 '15 at 13:14
  • @rintaro I used your method and it works, but I'm just not sure if I'm being efficient or not. If you had multiple `items` to capture (ex. title, author, comment) would you simply repeat ` if let <> = item["<>"].string {}` for each of them? – Craig.Pearce Jan 22 '16 at 02:10
  • @Craig.Pearce Basically, yes. But if you mind "efficiency", IMO you should not use SwiftyJSON. see: [SwiftyJSON Performance Issues](http://stackoverflow.com/q/29252158/3804019) – rintaro Jan 22 '16 at 02:18
  • @rintaro - Very interesting. For my initial application, SwiftyJSON should be ok, but I will bookmark that SO conversation for future consideration. Thanks. – Craig.Pearce Jan 22 '16 at 02:24
11

I Find it a bit strange explained myself, because actually using:

for (key: String, subJson: JSON) in json {
   //Do something you want
}

gives syntax errors (in Swift 2.0 atleast)

correct was:

for (key, subJson) in json {
//Do something you want
}

Where indeed key is a string and subJson is a JSON object.

However I like to do it a little bit different, here is an example:

//jsonResult from API request,JSON result from Alamofire
   if let jsonArray = jsonResult?.array
    {
        //it is an array, each array contains a dictionary
        for item in jsonArray
        {
            if let jsonDict = item.dictionary //jsonDict : [String : JSON]?
            {
                //loop through all objects in this jsonDictionary
                let postId = jsonDict!["postId"]!.intValue
                let text = jsonDict!["text"]!.stringValue
                //...etc. ...create post object..etc.
                if(post != nil)
                {
                    posts.append(post!)
                }
            }
        }
   }
CularBytes
  • 9,924
  • 8
  • 76
  • 101
8

In the for loop, the type of key can't be of the type "title". Since "title" is a string, go for : key:String. And then Inside the Loop you can specifically use "title" when you need it. And also the type ofsubJson has to be JSON.

And Since a JSON file can be considered as a 2D array, the json["items'].arrayValue will return multiple objects. It is highly advisable to use : if let title = json["items"][2].arrayValue.

Have a look at : https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Types.html

m0bi5
  • 8,900
  • 7
  • 33
  • 44
Dhruv Ramani
  • 2,633
  • 2
  • 22
  • 29
1

Please check the README

//If json is .Dictionary
for (key: String, subJson: JSON) in json {
   //Do something you want
}

//If json is .Array
//The `index` is 0..<json.count's string value
for (index: String, subJson: JSON) in json {
    //Do something you want
}
tangplin
  • 147
  • 4
0

you can iterate through the json by:

for (_,subJson):(String, JSON) in json {

   var title = subJson["items"]["2"]["title"].stringValue

   print(title)

}

have a look at the documentation of SwiftyJSON. https://github.com/SwiftyJSON/SwiftyJSON go through the Loop section of the documentation

2rahulsk
  • 488
  • 4
  • 10
  • 1
    While this might answer the authors question, it lacks some explaining words and/or links to documentation. Raw code snippets are not very helpful without some phrases around them. You may also find [how to write a good answer](https://stackoverflow.com/help/how-to-answer) very helpful. Please [edit] your answer - [From Review](https://stackoverflow.com/review/low-quality-posts/21982654) – Nick Jan 21 '19 at 02:51