2016-11-01 2 views
-1

У меня есть этот JSONкак получить значения JSON с помощью swiftyjson

{ 
    "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 

, но она всегда дает эту ошибку:

fatal error: unexpectedly found nil while unwrapping an Optional value

любая идея почему?

+2

Установить точку останова, отладки шаг за шагом. выяснили, какой из них nil – antonio081014

+0

json format неправильный, почему обратная косая черта добавляется к каждой клавише и значению, нет необходимости добавлять это –

+1

Возможный дубликат [Что делает «фатальная ошибка: неожиданно найденная нуль при разворачивании необязательного значения» означает? ] (HTTP: // StackOverflow.com/questions/32170456/what-do-fatal-error-неожиданно-found-nil-while-unwrapping-an-optional-valu) – rmaddy

ответ

1

На примере, который вы указали выше, есть немного неправильно, но ради того, чтобы вы двигались в правильном направлении, позвольте мне дать вам несколько советов и быстрое решение вашей проблемы.

Прежде всего, не начинайте переменные с символа верхнего регистра. Это не набор правил в камне или что-то еще, но лучше использовать camelCase, так как это сделает ваш код более понятным и не путает.

Во-вторых, вы делаете много принудительного литья и принудительно разворачиваете необязательные значения, из-за которых ваше приложение подвержено сбоям из-за той же ошибки, которую вы получаете сейчас. Я бы рассмотрел следующие рекомендации: https://stackoverflow.com/a/25195633/4660602

В-третьих, при публикации на 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) 
    } 

Пожалуйста, обратите внимание, что я не обновлять переменные идентификаторы правильной конвенции ради не запутанным вы, но вы должны действительно следовать правильному соглашению, как я упоминал в моем первом пункте.

Удачи.

EDIT: Забыл отметить, что ваш 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"} 
] 
+0

привет, спасибо за ваш ответ, я последовал за вашим кодом, но он дает мне: фатальная ошибка: индекс за пределами диапазона. –

+0

Посмотрите на обновление в ответ. –

+0

aha теперь это была проблема, которую я искал : D, большое спасибо за ответ и за советы, которые вы им предоставили, они действительно полезны –

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