我无法从swift 3中的给定URL获取子名称?

时间:2017-08-23 06:31:32

标签: ios json swift

在api am获取全局数组但是在这里我无法将子名称作为单独的数组只有最后加载的数组名称已经在数组中获取如何获取数组中的所有子名称请帮助我获取其中的所有名称,这里已经尝试了我的代码

var detailsArray = NSArray()
var globalArray = NSMutableArray()
let url = "http://www.json-generator.com/api/json/get/cwqUAMjKGa?indent=2"
func downloadJsonWithURL() {
    let url = NSURL(string: self.url)
    URLSession.shared.dataTask(with: (url as URL?)!, completionHandler: {(data, response, error) -> Void in
        if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary
        {
            self.detailsArray = (jsonObj?.value(forKey: "data") as? [[String: AnyObject]])! as NSArray
            print(self.detailsArray)
            for item in self.detailsArray
            {
                let majorDic = NSMutableDictionary()
                let detailDict = item as! NSDictionary
                print(detailDict["name"]!)
                majorDic .setValue(detailDict["name"]!, forKey: "name")
                print(detailDict["children"]!)
                if !(detailDict["children"]! is NSNull)
                {
                    let children = detailDict["children"]! as! NSArray
                    let childrenstring = NSMutableString()
                    if children.count > 0 {
                        for item in children{
                            let chilDic = item as! NSDictionary
                            print(chilDic["name"]!)
                            print(chilDic["products"]!)
                            majorDic.setValue(chilDic["name"]!, forKey: "Childernname")
                            let products = chilDic["products"]! as! NSArray
                            if products.count > 0
                            {
                                for item in products
                                {
                                    var sr = String()
                                    sr = (item as AnyObject) .value(forKey: "name") as! String
                                    childrenstring.append(sr)
                                    childrenstring.append("*")
                                }
                                majorDic.setValue(childrenstring, forKey: "Childernproducts")
                            }
                            else
                            {
                                print("products.count\(products.count)")
                                majorDic.setValue("NO DATA", forKey: "Childernproducts")
                            }
                        }
                    }
                    else
                    {
                        print("childernw.count\(children.count)")
                        majorDic.setValue("NO DATA", forKey: "Childernname")
                    }
                }
                else
                {
                    majorDic.setValue("NO DATA", forKey: "Childernname")
                    majorDic.setValue("NO DATA", forKey: "Childernproducts")
                }
                self.globalArray.add(majorDic)
            }
            print("TOTAL ASSECTS\(self.globalArray)")
            OperationQueue.main.addOperation({
                self.tableView.reloadData()
                print(self.globalArray)
                print(self.detailsArray)
            })
        }
    }).resume()
}

2 个答案:

答案 0 :(得分:1)

试试这个:

var detailsArray = [DataList]()
func downloadJsonWithURL() {
    let url = NSURL(string: "http://www.json-generator.com/api/json/get/cwqUAMjKGa?indent=2")
    URLSession.shared.dataTask(with: (url as URL?)!, completionHandler: {(data, response, error) -> Void in
        if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary
        {
            let objArr = (jsonObj?["data"]  as? [[String: AnyObject]])! as NSArray
            for obj in objArr {
                self.detailsArray.append(DataList(json: obj as! [String : AnyObject]))
            }
            print(self.detailsArray)
        }
    }).resume()
}

模型类

class DataList: NSObject {

    var count: Int
    var category_id: Int
    var childern:[Children]
    var name:String

    init (json: [String: AnyObject]){

        if let childrenList = json["children"] as? [[String: AnyObject]] {
            var result = [Children]()
            for obj in childrenList {
                result.append(Children(json: obj))
            }
            self.childern = result
        } else {
            self.childern = [Children]()
        }

        if let count = json["count"] as? Int { self.count = count }
        else { self.count = 0 }
        if let category_id = json["category_id"] as? Int { self.category_id = category_id }
        else { self.category_id = 0 }
        if let name = json["name"] as? String { self.name = name }
        else { self.name = "" }
    }
}

class Children:NSObject{
    var count:Int
    var category_id:Int
    var products:[Products]
    var name:String

    init (json: [String: AnyObject]){

        if let productList = json["products"] as? [[String: AnyObject]] {
            var result = [Products]()
            for obj in productList {
                result.append(Products(json: obj))
            }
            self.products = result
        } else {
            self.products = [Products]()
        }

        if let count = json["count"] as? Int { self.count = count }
        else { self.count = 0 }
        if let category_id = json["category_id"] as? Int { self.category_id = category_id }
        else { self.category_id = 0 }
        if let name = json["name"] as? String { self.name = name }
        else { self.name = "" }

    }
}


class Products:NSObject{
    var product_id:Int
    var name:String

    init (json: [String: AnyObject]){

        if let product_id = json["product_id"] as? Int { self.product_id = product_id }
        else { self.product_id = 0 }

        if let name = json["name"] as? String { self.name = name }
        else { self.name = "" }

    }
}

注意:请在解析时检查您的数据类型

答案 1 :(得分:0)

我也有同样的问题。而不是使用for循环尝试使用flatMap(),然后使用value(forKey: " ")函数

提取值
let productNames = productValues.flatMap() {$0.value}   
let names = (productNames as AnyObject).value(forKey: "name")

这对我的json有用。我的Json和你的相似。 我在数组中得到了单独的值。