如何解析JSON字典

时间:2016-10-10 16:11:35

标签: json swift dictionary alamofire

我有以下包含JSON字典的JSON响应:

enter image description here

我需要的是仅提取3个类别的名称(我的屏幕截图中只显示了1个,即#34;饮料",但您可以在最顶层看到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包含整个回复。

如何正确搜索?

2 个答案:

答案 0 :(得分: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一切顺利,名称变量应该具有您想要的正确信息

答案 1 :(得分:0)

回答我自己的问题,如果这有助于任何人,我最终使用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)")
            }
    }
}