Как получить значения 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"}
]
Другие вопросы по тегам