Как пройти через JSON с SwiftyJSON?

У меня есть json, что я могу разобрать SwiftyJSON:

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

Работает отлично.

Но я не мог его пропустить. Я пробовал два метода, первый из них

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

XCode не принял объявление цикла цикла.

Второй способ:

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

XCode не принимал оператор if.

Что я делаю не так?

Ответы

Ответ 1

Если вы хотите получить цикл через json["items"] массив, попробуйте:

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

Что касается второго метода, .arrayValue возвращает Optional массив, вы должны использовать вместо него .array:

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

Ответ 2

Я нахожу это немного странным, объяснил сам, потому что фактически использовал:

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

дает синтаксические ошибки (в Swift 2.0 atleast)

Правильно было:

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

Где ключ - это строка, а subJson - объект JSON.

Однако мне нравится делать это немного иначе, вот пример:

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

Ответ 3

В цикле for тип key не может быть типа "title". Так как "title" является строкой, перейдите для: key:String. И тогда внутри цикла вы можете специально использовать "title" когда вам это нужно. А также тип subJson должен быть JSON.

А поскольку JSON файл можно рассматривать как 2D-массив, json["items'].arrayValue будет возвращать несколько объектов. Настоятельно рекомендуется использовать: if let title= json["items"][2].arrayValue.

Взгляните на: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Types.html

Ответ 4

Проверьте 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 string value
for (index: String, subJson: JSON) in json {
    //Do something you want
}

Ответ 5

Вы можете перебрать JSON:

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

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

   print(title)

}

взгляните на документацию SwiftyJSON. https://github.com/SwiftyJSON/SwiftyJSON просмотрите раздел Loop документации