Swift和访问嵌套的JSON集合

时间:2017-02-23 04:48:30

标签: json swift

我正在访问带有预先烘焙的JSON输出的CMS,它使用以下数据结构。我正在努力深入到嵌套集合中以获取版本或循环通过类别。

{
    results: [
        {
            pageData: {
                info: {
                    version: "1"
                },
                categories: [
                    {
                        name: "Cat 1"
                    },
                    {
                        name: "Cat 2"
                    }
                ]
            }
        }
    ]
}

这是我试图使用的代码。任何帮助表示赞赏!

guard let json = json, let results = json["results"], let pageData = results["pageData"], let info = pageData["info"] as? [String:Int], let version = info["version"], 
    let categories = Category.getCategories(json: json) else {
    self.completionParse(RequestResult.errorParsing, self.categoriesResult)
    return
}

2 个答案:

答案 0 :(得分:3)

要访问infocategories词典,您需要先访问位于results数组的第一个对象内的pageData数组和results。< / p>

guard let json = json, let results = json["results"] as? [[String:Any]], 
    let firstDic = results.first, let pageData = firstDic["pageData"] as? [String:Any],
    let info = pageData["info"] as? [String:Int], let version = info["version"], 
    let categories = Category.getCategories(json: pageData) else {

    self.completionParse(RequestResult.errorParsing, self.categoriesResult)
    return
}

答案 1 :(得分:1)

在操场上测试下面的代码。这段代码是最新的swift 3。

if let dictResponse = json as? [String:Any] {
    // This will get entire dictionary from your JSON.
    if let results = dictResponse["results"] as? [[String:Any]]{
        if let pageData = results.first? ["pageData"] as? [String:Any]{
            if let info = pageData["info"] as? [String:Any]{
                if let version = info["version"] as? String{
                    print(version)
                    // This will print 1
                }
            }

            if let categories = pageData["categories"] as? [[String:Any]]{
                // This will give you a category array. Later on you can iterate and get the dictionary’s value of each element.
                for categoriesObj in categories.enumerated(){
                    if let name = categoriesObj.element["name"]{
                        print(name)
                    }
                }
            }           
        }   
    }
}