2016-10-10 6 views
0

У меня есть следующий ответ JSON, содержащий словарь JSON:Как разобрать JSON словарь

enter image description here

Что мне нужно только извлечь 3 категории имен (только 1, показанный на скриншоте, а именно «Напитки », но вы можете увидеть в самом верху счет 3).

Я пробовал следующее, но всегда возвращаю ноль.

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 содержит полный ответ.

Как правильно искать?

ответ

0

ответить на мой собственный вопрос в случае, если это HEL ps, я закончил с использованием 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)") 
      } 
    } 
} 
0

Для этого конкретного 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] и в вашем случае категории [0] будет хранить информацию для одного с напитки т.е.

guard let drinksCategory = categories.first, 
    let name = drinksCategory["name"] as? String else { 
     return 
} 

Теперь, если все хорошо с JSON имя переменной должно иметь правильную информацию, которую вы хотите

+0

спасибо за предложение, но категории все еще возвращаются нуль. – Polis