2015-02-06 2 views
24

У меня есть 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 не принял, если заявление.

Что я делаю неправильно?

ответ

60

Если вы хотите перебрать 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) 
     } 
    } 
} 
+0

, когда я пытаюсь проскочить через словарь [String: JSON], я получаю сообщение об ошибке: «[String: JSON]?» не имеет члена с именем 'Generator' – mattgabor

+0

, потому что он необязательный – nikans

+0

@ rintaro Я использовал ваш метод, и он работает, но я просто не уверен, что я эффективен или нет.Если бы у вас было несколько «элементов» для захвата (например, название, автор, комментарий), вы бы просто повторили 'if let <> = item [" <> "]. String {}' для каждого из них? –

5

В цикле 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

+0

Пожалуйста, отметьте, что зеленый ярлык на левой, если я помог. Благодаря! –

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 
} 
+1

Он заявил в вопросе, что он проверил документы. Не очень полезно imo. Сожалею. –

+0

Это помогло мне совсем немного. Спасибо – derickito

7

Я считаю, это немного странно объяснил себя, потому что на самом деле с помощью:

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

дает синтаксических ошибок (в Swift 2.0 по крайней мере)

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

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!) 
       } 
      } 
     } 
    } 
+0

Правильный синтаксис для (key, subJson) :(String, JSON) в json – Emptyless