2017-02-09 3 views
0

Я пытаюсь извлечь значение из сериализации JSON, но в результате получим nil.Результат JSON после парсинга

Приложение работает под Swift2, поэтому его преобразование в Swift 3, где начался вопрос.

let jsonResult = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary 
print(jsonResult!) 
let mySuccess = jsonResult?["success"] as? Int 
print (mySuccess!) 

печати (JsonResult!) дает следующий вывод

{ 
"full_login" = 0; 
"logged_in" = 1; 
message = "<null>"; 
success = 1; 
} 

Так что все хорошо до сих пор, и мой разборе работает и теперь у меня есть данные с сервера.

Однако печать (mySuccess!) дает этот выход

fatal error: unexpectedly found nil while unwrapping an Optional value

Так что я понимаю, что вывод о том, что код найден ноль, а разворачивать, так что мой вопрос теперь как извлечь значение «Успех» ключ, поскольку он вел себя под Swift 2, но теперь не так под Swift 3?

UPDATE

Скрытность нашли возможный вопрос, что успех = 1 нет «» так будет обновлять вопрос ответ, как только я исследую.

+0

Возможный дубликат [JSON Парсинга в Swift 3] (http://stackoverflow.com/questions/38155436/json-parsing-in-swift-3) –

ответ

0

Ваш журнал печати success = 1; показывает, что jsonResult?["success"] не является nil. JSONSerialization.jsonObject может возвращать только три вещи, которые будут отображаться как 1: строка, число или значение true. Поскольку вы пытались развернуть его как Int, и это не удалось, единственными левыми возможностями являются то, что он был String или Bool.

Вы, вероятно, имеют success либо как:

"success": true 

Или:

"success": "1" 

Таким образом, вы можете сделать:

let mySuccess = jsonResult?["success"] as? Bool 

Или:

let mySuccess = jsonResult?["success"] as? String 

Или запросите изменение в ответном интерфейсе API.

+0

Я не думаю этот вопрос, так как он должен получить сбой в Swift 2, если это так (?) не уверен, что вы тоже можете быть прав. –

+0

Спасибо за это, попробовал, но не помог. Тем не менее, фатальная ошибка в качестве успеха по-прежнему равна нулю. Выход не имеет "", поэтому я думаю, что это правильный формат ключевого значения. – timv

+1

@timv Вы прочитали дублируемую тему, которую я разместил? –

0

Хорошо, поэтому комментарии были действительно полезными и помогли мне вникать в проблему. Я начал смотреть на недостающее «», но заметил, что, когда я вошел в следующий код:

for (key, value) in jsonResult! 
{ 
    print (key) 
    print (value) 
} 

я получаю следующие выходные данные

logged_in 
1 
full_login 
0 
success 
1 
message 
<null> 

Так что должен был быть способ, чтобы получить только значение для успех.
This page дал мне решение в конце. я должен был использовать следующий код:

let myResult = (jsonResult?["success"]) 
print("SUCCESS VALUE >> ", myResult!) 

Это теперь дает мне значение и все решается. Еще раз спасибо за комментарии, поскольку они помогли.

Я тогда был вопрос, не понимая ценность успеха была Bool, так что я должен был использовать следующий код для проверки истинным или ложным:

if (jsonResult?["success"] as? Bool)! 
{ 
    okToLogIn = true 
    print(okToLogIn) 
} 
    else 
{ 
    okToLogIn = false 
    print(okToLogIn) 
    } 

Теперь все хорошо, и приложение снова работает под Swift 3 .

1

привет, вы можете использовать концепцию ДОПОЛНИТЕЛЬНОЕ ОБРАБОТКА для проверки значений нуля.

let jsonResult = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary 
print(jsonResult!) 
if let mySuccess = jsonResult?["success"] as? Bool 
{ 
print (mySuccess) 
} 
else 
{ 
print ("Found nil") 
}