2015-08-19 2 views
1

У меня есть приложение, в котором я пытаюсь извлечь данные из API, который я создал (API основан на NODE.js, MongoDB, Express.js)Разбор массива объектов и заполнение табличных ячеек таблицы Swift

В настоящее время я пытаюсь вытащить и массировать объекты, а затем создать табличное представление на основе этого массива объектов. Например, если массив объектов содержит 4 объекта, то в представлении таблицы будет 4 ячейки. И, щелкнув ячейку, я перейду к другому виду, где я смогу просмотреть подробный вид этого объекта.

Как я могу проанализировать возвращенные данные JSON из API и заполнить ячейки представления таблицы?

Мой Выпуск:

В настоящее время я не могу разобрать возвращаемый массив объектов. Ниже приводится изображение из того, что возвращаемый JSON содержит:

enter image description here

Ошибка:

Я получаю следующее сообщение об ошибке:

Error could not parse JSON: Optional([ 
    { 
     "_id": "55d1db984f80687875e43f89", 
     "password": "$2a$08$OQB/r9iIZdSFlN9L5vaiE.qILB8gP/YtlsA3S41usVnM/eXHBW9j6", 
     "email": "[email protected]", 
     "__v": 0, 
     "sector": "Manufacturing", 
     "jobTitle": "Something 1", 
     "employeeName": "Something 1" 
    }, 

    // it displays all the data being returned in JSON response 

    ]) 

Ниже моя SWIFT код :

import UIKit 

    class SectorViewController: UIViewController { 

    @IBAction func getManufacturingBios(sender: AnyObject) { 

    var request = NSMutableURLRequest(URL: NSURL(string: "https://myURL/user/all")!) 
    var session = NSURLSession.sharedSession() 
    request.HTTPMethod = "GET" 
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true 

    var err: NSError? 

    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.addValue("application/json", forHTTPHeaderField: "Accept") 

    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
     println("Response: \(response)") 

     var strData = NSString(data: data, encoding: NSUTF8StringEncoding) 

     println("Body: \(strData)") 
     var err: NSError? 
     var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary 

     UIApplication.sharedApplication().networkActivityIndicatorVisible = true 

     // Did the JSONObjectWithData constructor return an error? If so, log the error to the console 
     if(err != nil) { 

      println(err!.localizedDescription) 
      let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding) 
      println("Error could not parse JSON: '\(jsonStr)'") 
      } 

     else { 

      UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
      // The JSONObjectWithData constructor didn't return an error. But, we should still 
      // check and make sure that json has a value using optional binding. 

      if let parseJSON = json { 

      // Okay, the parsedJSON is here, let's get the value for 'success' out of it 

       var sector = parseJSON["sector"] as! String 
       println("Succes: \(sector)") 

      } 
      else { 
       // Woa, okay the json object was nil, something went worng. Maybe the server isn't running? 
       let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding) 
       println("Error could not parse JSON: \(jsonStr)") 

      } 
     } 
    }) 

    task.resume() 
} 
} 
+0

Это _looks_, как будто вы возвращаете JSONP (т.е. JSON дополняется функцией «Необязательный»). Правильно ли это звучит? – Andy

+0

@ Andy Нет У меня нет функции, называемой Необязательно в моем коде. Не знаете, как это исправить. – Skywalker

ответ

2

Возможно, вы можете попытаться использовать NSArray вместо словаря и изменить параметры чтения. Я бы рекомендовал сделать это. например:

var json : NSArray? = nil  
json = (NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers , error: &error) as? NSArray)! 

Надеюсь, что решает вашу проблему.

+0

oops не видел вашего ответа. Получил 2 минуты поздно. – iphondroid

+0

ха-ха, без проблем, помощник: D – Tobias

+0

@Tobias Спасибо за ответ. Можете ли вы посоветовать, как изменить параметры чтения? – Skywalker

2

Вместо

var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary 

должно быть

var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSArray 

, потому что ваше содержание ответа представляет собой массив, начиная с [ и на самом деле его элементы типа NSDictionary. Всегда искать стартовые скобки, если это [ или {.

Начало массива JSON & заканчивается квадратными скобками и начинается словарь JSON & заканчивается фигурными фигурными скобками.

+0

Благодарим вас за ответ. После внесения изменений я получил следующую ошибку: «AnyObject не конвертируется в String» в следующую строку var sector = parseJSON ["sector"] as! String – Skywalker

+1

'json' - массив, поэтому вам нужно итерации по массиву. Если вам нужен первый элемент, тогда вы должны написать 'let firstDict = parseJSON [0] как NSDictionary'. – iphondroid