如何使用SwiftyJSON循环JSON?

时间:2015-02-06 12:36:09

标签: ios json swift swifty-json

我有一个可以用SwiftyJSON解析的json:

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没有接受for循环声明。

第二种方法:

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

XCode没有接受if语句。

我做错了什么?

5 个答案:

答案 0 :(得分:73)

如果您想循环通过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)
        }
    }
}

答案 1 :(得分:10)

我发现自己有点奇怪,因为实际使用:

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

给出语法错误(至少在Swift 2.0中)

正确的是:

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

其中key确实是一个字符串,而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!)
                }
            }
        }
   }

答案 2 :(得分:7)

在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

答案 3 :(得分:2)

请查看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
}

答案 4 :(得分:0)

您可以通过以下方式遍历json:

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

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

   print(title)

}

看一下SwiftyJSON的文档。 https://github.com/SwiftyJSON/SwiftyJSON 浏览文档的“循环”部分