2015-10-03 4 views
0

У меня есть база данных с такими атрибутами, как url, title и timestamp. Когда я загружаю определенный контроллер представления, я извлекаю данные файла и загружаю его в таблицу. Поскольку есть несколько файлов, каждый из которых имеет 3 атрибута, я пытаюсь сохранить данные в массиве, а затем просматривать каждый объект в массиве и извлекать данные JSON. На данный момент запрос и ответ GET успешны, но массив остается нулевым. Является ли мой подход неправильным?Хранение извлеченных json-словарей в массиве, в результате чего nil

let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 

     guard let data = data, response = response else 
     { 
      print("No data or response!") 
      return 
     } 

     let strData = NSString(data: data, encoding: NSUTF8StringEncoding) 
     print("Body: \(strData)", terminator: "") 

     do { 
      self.fetchedArray = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves) as? NSArray 


      print("fetched array count is %i \(self.fetchedArray!.count)") 


      if let jsonArray: NSArray = self.fetchedArray{ 


       for var i = 0; i<jsonArray.count; ++i { 


        let dictResult = jsonArray.objectAtIndex(i) as! NSDictionary 

        let recording = Recordings() 
        recording.trackURL = dictResult["url"] as? String 
        recording.trackTimestamp = dictResult["timestamp"] as? String 
        recording.trackAuthor = dictResult["author"] as? String 
        recording.trackTitle = dictResult["title"] as? String 
        self.recordings?.addObject(recording) 

        } 
      } 
      else 
      { 
       // No error thrown, but not NSDictionary 
       let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding) 
       print("No error thrown but could not parse JSON: '\(jsonStr)'") 
      } 
     } 
     catch let parseError { 
      // Log the error thrown by `JSONObjectWithData` 
      print(parseError) 
      let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding) 
      print("Error thrown. could not parse JSON: '\(jsonStr)'") 
     } 
    }) 

    task.resume() 

Как теперь его выполнив второй к последнему еще о print("No error thrown but could not parse JSON: '\(jsonStr)'") и печать всех данных.

Журнал данных до сериализации:

Response: <NSHTTPURLResponse: 0x7c349990> { URL: http://127.0.0.1:5000/auth/serve_current_user_files } { status code: 200, headers { 
"Content-Length" = 239; 
"Content-Type" = "application/json"; 
Date = "Sat, 03 Oct 2015 02:53:00 GMT"; 
Server = "Werkzeug/0.10.4 Python/2.7.10"; 
"Set-Cookie" = "session=eyJfZnJlc2giOnRydWUsIl9pZCI6eyIgYiI6Ik16RXhaRGs0TldVM1lUQmxNREJrWlRNeFpqZ3pZMkl3T1dRNE5EZzVPREk9In0sInVzZXJfaWQiOiIxIn0.CPDUjA.Mm56VPuZPIokCZVoRw7X2ySz960; HttpOnly; Path=/"; 
} }Body: Optional({ 
    "recordings": [ 
    { 
    "author": 1, 
    "timestamp": "Sun, 27 Sep 2015 17:44:54 GMT", 
    "title": "Test1.m4a", 
    "url": "/Users/allahesharghi/Desktop/Omid/pythonprojects/sound/sound/uploads/omid1/Test1.m4a" 
} 
] 
+0

Убедитесь, что данные верны.
In print ("Тело: \ (strData)", terminator: "") Выдает ли результат результат, что вы хотите? – wei

+0

Единственный оператор печати, который запускается, является печатью во втором-последнем выражении else, поскольку массив выходит из nil. Данные выглядят правильными. – Brosef

+0

Я имел ввиду перед объектами сериализации json, убедитесь, что данные верны. или разместите свои журналы здесь, чтобы было легче увидеть, что не так. – wei

ответ

0

Ваш JSON является:

{ 
    "recordings": [ 
     { 
      "author": 1, 
      "timestamp": "Sun, 27 Sep 2015 17:44:54 GMT", 
      "title": "Test1.m4a", 
      "url": "/Users/allahesharghi/Desktop/Omid/pythonprojects/sound/sound/uploads/omid1/Test1.m4a" 
     } 
    ] 
} 

Таким образом, корневой объект не является массивом, это словарь с массивом словарей для ключ recordings. Это означает, что когда вы говорите

self.fetchedArray = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves) as? NSArray 

self.fetchedArray будет ноль, потому что опущенные к NSArray потерпит неудачу, потому что NSDictionary не может быть опущенной к NSArray.

Вы должны получить доступ к корневой словарь, а затем получить доступ к массиву из записей ключевых -

do { 
     someDictionary = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves) as? NSDictionary 
     self.fetchedArray = someDictionary!["results"] as? NSArray 
      print("fetched array count is %i \(self.fetchedArray!.count)") 
... 
+0

Вы правы. Тем не менее, я попытался реализовать это, и я получил сообщение об ошибке «не может индексировать значение типа NSDictionary?» когда я устанавливаю 'self.fetchedArray = someDictionary' – Brosef

+0

Извините, я не разворачивал дополнительный словарь – Paulw11

Смежные вопросы