Как анализировать словарь JSON

#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)")
            }
    }
}