Как получить значения JSON, используя swiftyjson
У меня есть этот JSON
{
"chatUsers":"[
{"id":"5","sender_id":"6","receiver_id":"1","content":"hi","datetime":"2016-11-19 00:00:00"},
{"id":"4","sender_id":"1","receiver_id":"2","content":"hello","datetime":"2016-11-11 00:00:00"},
{"id":"2","sender_id":"1","receiver_id":"3","content":"how are you","datetime":"2016-11-04 00:00:00"}
]",
"chatsCount":3
}
Теперь у меня есть этот код для получения данных из URL:
let StringUrl = NSURL(string: url) as NSURL!
let Data = NSData(contentsOfURL: StringUrl) as NSData!
let ReadableData = JSON(data: Data)
let result = ReadableData["chatUsers"][0]["id"].string! as String // this should gives 5
но это всегда дает эту ошибку:
фатальная ошибка: неожиданно найден ноль при развертывании необязательного значения
есть идеи почему?
1 ответ
В приведенном выше примере все немного не так, но ради того, чтобы вы двигались в правильном направлении, позвольте мне дать вам несколько советов и быстрое решение вашей проблемы.
Во-первых, не начинайте свои переменные с заглавных букв. Это не набор в каменном правиле или чем-то еще, но лучше использовать camelCase, так как это сделает ваш код более читабельным и позволит избежать путаницы.
Во-вторых, вы выполняете принудительное приведение и развертывание необязательных значений, что сделает ваше приложение склонным к сбоям из-за той же ошибки, которую вы получаете сейчас. Я хотел бы взглянуть на следующее для лучшего руководства: /questions/42223121/kak-vyi-razvorachivaete-optsionyi-swift/42223128#42223128
В-третьих, при публикации на SO, пожалуйста, убедитесь, что вы четко даете контекст своего вопроса, так как некоторые пользователи могут подумать, что вы задаете вопрос о том, что optionals
и почему вы получаете fatal error: unexpectedly found nil while unwrapping an Optional value
ошибка.
С учетом вышесказанного, в будущем, пожалуйста, обязательно посмотрите документы SwiftyJSON, так как они довольно четко демонстрируют, как использовать библиотеку. Причина, по которой ваш код не работает, заключается в том, что вы неправильно обрабатываете JSON. Вот обновленный пример:
let StringUrl = NSURL(string: url) as NSURL!
let Data = NSData(contentsOfURL: StringUrl) as NSData!
let ReadableData = JSON(data: Data)
let chatUsers = ReadableData["chatUsers"].arrayValue
let result = chatUsers[0]["id"].stringValue
или если вам нужно перебрать всех пользователей:
let StringUrl = NSURL(string: url) as NSURL!
let Data = NSData(contentsOfURL: StringUrl) as NSData!
let ReadableData = JSON(data: Data)
for chatUser in ReadableData["chatUsers"]{
print(chatUser.1["id"].stringValue)
}
Обратите внимание, что я не обновил ваши идентификаторы переменных в соответствии с правильным соглашением, чтобы не вводить вас в заблуждение, но вы должны действительно следовать правильному соглашению, как я упоминал в моем первом пункте.
Удачи.
РЕДАКТИРОВАТЬ: Забыл упомянуть, что ваш JSON неправильно отформатирован. Исправьте данные JSON в правильном формате JSON, чтобы SwiftyJSON мог правильно их интерпретировать. Вы получаете индекс вне диапазона, потому что SwiftyJSON НЕ знает chatUsers
является массивом, потому что квадратные скобки заключены в двойные кавычки, когда они не должны быть. Так
"chatUsers":"[
{"id":"5","sender_id":"6","receiver_id":"1","content":"hi","datetime":"2016-11-19 00:00:00"},
{"id":"4","sender_id":"1","receiver_id":"2","content":"hello","datetime":"2016-11-11 00:00:00"},
{"id":"2","sender_id":"1","receiver_id":"3","content":"how are you","datetime":"2016-11-04 00:00:00"}
]"
должно быть
"chatUsers": [
{"id":"5","sender_id":"6","receiver_id":"1","content":"hi","datetime":"2016-11-19 00:00:00"},
{"id":"4","sender_id":"1","receiver_id":"2","content":"hello","datetime":"2016-11-11 00:00:00"},
{"id":"2","sender_id":"1","receiver_id":"3","content":"how are you","datetime":"2016-11-04 00:00:00"}
]