При получении данных из api я могу получить ответ либо на массив продуктов, либо на словарь с ошибкой, например.Как разобрать неизвестный тип данных json в swift 2
Если все прошло правильно апи посылает множество продуктов, как:
[ "Product1": { name = "someting", price = 100, discount = 10%, images = [image1,image2] }, "Product2": { name = "someting", price = 100, discount = 10%, images = [image1,image2] } ]
Но если какая-то ошибка происходит он посылает словарь с сообщением об ошибке и код, как:
{ error_message = "message" error_code = 202 }
Я использую этот код для преобразования данных JSON в массив:
do {
let jsonDict = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSArray{
//Some code....
} catch let error as NSError {
print("JSON Error: \(error.localizedDescription)")
}
, но если я получу ошибку, как словарь, это приведет к сбою.
Проблемы: 1. Как узнать, являются ли полученные данные массивом или словарем? 2. Какое-то время даже ключ или значение может отсутствовать, так проверка значения становится очень длинным код, как:
if let productsArray = jsonObject as? NSArray{
if let product1 = productsArray[0] as? NSDictionary{
if let imagesArray = product1["image"] as? NSArray{
if let imageUrl = imagesArray[0] as? String{
//Code ....
}
}
}
}
Я читал о охраннику ключевое слово, чтобы уменьшить, если условие, но у меня нет четкого представления, как использовать здесь.
Как вы получаете в JSON? - Можете ли вы увидеть код статуса ответа HTTP? –
@thefredelement Да, я могу получить код ошибки ответа, который он отправляет моим сервером, специфичным для любого продукта, например, пытается получить недоступную деталь продукта. –
Я бы порекомендовал загрузить библиотеку SwiftyJSON из Github, поэтому вам не нужно иметь 10 уровней вложенных if-let's –