【问题标题】:How to parse JSON dictionary如何解析 JSON 字典
【发布时间】:2016-10-10 16:11:35
【问题描述】:

我有以下包含 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 包含整个响应。

如何正确搜索?

【问题讨论】:

    标签: json swift dictionary alamofire


    【解决方案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 变量应该包含您想要的正确信息

    【讨论】:

    • 感谢您的建议,但类别仍然返回 nil。
    【解决方案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)")
                }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多