Фатальная ошибка: неожиданно обнаружен ноль при развертывании необязательного значения в Swift при попытке проанализировать JSON

Я пытался создать основанное на документе приложение Какао, и когда я попытался проанализировать JSON в readFromData: ofType: error: Метод, я получил ошибку: fatal error: unexpectedly found nil while unwrapping an Optional value, Фактическая строка, которая вызвала ошибку, выглядит следующим образом:

override func readFromData(data: NSData?, ofType typeName: String?, error outError: NSErrorPointer) -> Bool {
    var error: NSErrorPointer!
    var loadedDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: error) as? NSDictionary // this causes an error
    return true
}

Похоже, NSJSONSerialization.JSONObjectWithData() Метод вызвал ошибку, но почему он ее выдал?

Я изменился options: аргумент либо nil или же 0, а также изменилось error: аргумент nil, но ничего не решило проблему.

Я также гарантировал, что data не является nil,

Так чего мне не хватает? Я думаю, что метод JSON пытался принудительно развернуть его, но как я могу это знать? И как я могу избежать фатальной ошибки и правильно запустить мое приложение?

Я использую Xcode6-beta 3 на Yosemite beta3.

3 ответа

Решение

Скорее всего, проблема в том, что у вас есть данные, которые на самом деле не являются JSON, поэтому десериализация вернет nil, или данные будут массивом, и преобразование их в словарь, очевидно, приведет к сбою.

Вы, кажется, не понимаете некоторые основы. Как вы думаете, что AllowFragments собирается достичь? И почему вы изменили ошибку на ноль? Вы понимаете, для чего существует переменная ошибки? Он расскажет вам, какие ошибки обнаружил анализатор JSON. Установив переменную в ноль, вы не позволяете ей помочь вам.

Если данные не содержат действительный объект JSON, JSONObjectWithData Функция вернет ноль, поэтому вам нужно выполнить условное развертывание следующим образом:

if let dict = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: jsonError) as? NSDictionary {
    println("Dictionary: \(dict)")
} else {
   println("nil")
   let resultString = NSString(data: data, encoding: NSUTF8StringEncoding)
   println("Flawed JSON String: \(resultString)")
}

Я надеюсь, что это помогает..... е

  • В этом случае outError предоставляется в качестве аргумента, поэтому вы должны использовать его (я упустил это из виду).
  • Похоже, целью этой функции является проверка правильности данных в формате JSON.

Тогда ваша функция должна быть:

override func readFromData(data: NSData?, ofType typeName: String?, error outError: NSErrorPointer) -> Bool {
    if let loadedDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: outError) as? NSDictionary {
       return true
    } else {
       return false
    }
}

Теперь эта функция:

  • ошибка записи туда, где абонент указал ourError в случае возникновения ошибки
  • возвратите, если данные действительны в формате JSON как NSDictionary

К вашему сведению, я тоже написал обработчик JSON.

Который включает в себя NSJSONSerialization.JSONObjectWithData,

Другие вопросы по тегам