#json #swift #dictionary #alamofire
#json #swift #словарь #alamofire
Вопрос:
У меня есть следующий ответ JSON, содержащий словарь JSON:
Что мне нужно, так это извлечь только 3 названия категорий (на моем скриншоте показано только 1, а именно «Напитки», но вы можете увидеть в самом верху количество 3).
Я пробовал следующее, но всегда возвращал nil.
func getMenuCategories() {
let headers = [
"Api-key": apiKey
]
let url = "https://xxxxxxxx/menu/categories"
Alamofire.request(.GET, url, headers: headers, encoding: .JSON)
.responseJSON { response in switch response.result {
case .Success(let JSON):
print("Success with JSON: (JSON)")
let response = JSON as! NSDictionary
let categories1 = response.objectForKey("_embedded")! // always nil
let categories2 = response.objectForKey("categories")! // always nil
case .Failure(let error):
print("Request failed with error: (error)")
}
}
}
Я знаю, что получаю правильный ответ, потому что переменная JSON
содержит весь ответ.
Как я могу выполнить правильный поиск?
Ответ №1:
Для этого конкретного JSON вы могли бы сделать следующее
guard let jsonData = JSON as? [String: Any],
let embedded = jsonData["_embedded"] as? [String: Any],
let categories = embedded["categories"] as? [[String: Any]] else {
return
}
Теперь категории должны иметь массив [String:Any], и в вашем случае categories [0] будет содержать информацию для одного с напитками, т. е.
guard let drinksCategory = categories.first,
let name = drinksCategory["name"] as? String else {
return
}
Теперь, если с JSON все в порядке, переменная name должна содержать правильную информацию, которую вы хотите
Комментарии:
1. спасибо за предложение, но категории по-прежнему возвращаются нулевыми.
Ответ №2:
чтобы ответить на мой собственный вопрос, если это кому-нибудь поможет, я закончил valueForKeyPath
следующим образом:
func getMenuCategories() {
let headers = [
"Api-key": apiKey
]
let url = "https://xxxxxxxx/menu/categories"
Alamofire.request(.GET, url, headers: headers, encoding: .JSON)
.responseJSON { response in switch response.result {
case .Success(let JSON):
print("Success with JSON: (JSON)")
let jsonData = JSON as? NSDictionary
let categories = jsonData?.valueForKeyPath("_embedded.categories._embedded.items._embedded.menu_categories.name")
case .Failure(let error):
print("Request failed with error: (error)")
}
}
}