Как пройти через 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 документации