web-dev-qa-db-fra.com

Comment parcourir JSON avec SwiftyJSON?

J'ai un json que je pourrais analyser avec SwiftyJSON:

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

Marche parfaitement.

Mais je ne pouvais pas le parcourir. J'ai essayé deux méthodes, la première est

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

XCode n'a pas accepté la déclaration de boucle for.

La deuxième méthode:

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

XCode n'a pas accepté l'instruction if.

Qu'est-ce que je fais mal ?

32
Cherif

Si vous voulez parcourir le tableau json["items"], essayez:

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

En ce qui concerne la seconde méthode, .arrayValue renvoie le tableau non Optional, vous devez utiliser .array à la place:

if let items = json["items"].array {
    for item in items {
        if let title = item["title"].string {
            println(title)
        }
    }
}
72
rintaro

Je trouve cela un peu étrange, explique moi-même

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

donne des erreurs de syntaxe (dans Swift 2.0 au moins)

correct était:

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

Où en effet key est une chaîne et SubJson est un objet JSON.

Cependant, j'aime le faire un peu différemment, voici un exemple: 

//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!)
                }
            }
        }
   }
9
CularBytes

Dans la boucle for, le type de key ne peut pas être du type "title". Puisque "title" est une chaîne, cherchez: key:String. Et ensuite, Inside the Loop, vous pouvez utiliser spécifiquement "title" lorsque vous en avez besoin. Et aussi le type de subJson doit être JSON.

Et puisqu'un fichier JSON peut être considéré comme un tableau 2D, le json["items'].arrayValue renverra plusieurs objets. Il est vivement conseillé d'utiliser: if let title = json["items"][2].arrayValue.

Consultez: https://developer.Apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Types.html

7
Dhruv Ramani

S'il vous plaît vérifier le 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
}
2
tangplin

vous pouvez parcourir le JSON en:

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

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

   print(title)

}

consultez la documentation de SwiftyJSON . https://github.com/SwiftyJSON/SwiftyJSON parcourez la section Boucle de la documentation.

0
2rahulsk