我试图使用循环获取存储在JSONData中的曲目的名称

时间:2016-09-18 16:59:46

标签: json swift api

这是代码。

func callFire(url:String) {
    Alamofire.request(url).responseJSON(completionHandler: {response in
        self.parseData(JSONData: response.data!)
    })
}

func parseData(JSONData: Data) {
    do {
        var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONStandard
        if let tracks = readableJSON["tracks"] as? JSONStandard {
            if let items = tracks["items"]{
                for i in 0..<items.count {
                    let item = items[i] as! JSONStandard
                    let name = item["name"] as! String
                    trackNames.append(name)
                    self.tableView.reloadData()
                }
            }
        }
    }
    catch {
        print(error)
    }
}

这是我收到错误的地方&#34;模糊地使用&#39;下标&#39;&#34;

让item = items [i]为! JSONStandard

2 个答案:

答案 0 :(得分:0)

为什么使用JSONStandard?只需将该节点转换为Map或Array即可。如果是地图,你会这样做:

public static int[] longestStreak(boolean[] values) {
       Scanner input = new Scanner(System.in);
       boolean TorF[] = new boolean[] 

       if (input == False) 
       {
          System.out.println(TorF.length);    
       }
       else 
       {
           System.out.println(TorF.length);
       }
       return TorF;
}

然后你可以通过名字来解决问题,例如:

if let tracks = readableJSON["tracks"] as? [String: Any]

BTW,这是来自最近发布的关于处理JSON的this guide Apple。

答案 1 :(得分:0)

以下是您的parseData(JSONData: Data)看起来应该是这样的

var trackNames = [String]()

func parseData(JSONData: Data) {
    do {
        if let readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .allowFragments) as? [String: Any],
             let tracks = readableJSON["tracks"] as? [String: Any],
                 let items = tracks["items"] as? [[String: Any]] {
                    trackNames.append(contentsOf: items.map{$0["name"] as! String})
                    self.tableView.reloadData()
            }
    } catch {
        print(error)
    }
}

有效JSON始终包含[String:Any]字段,其中Any可以再次[String:Any]表示嵌套字典。 这是测试:

let json = "{\"tracks\":{\"items\":[{\"name\":\"a\"},{\"name\":\"b\"},{\"name\":\"c\"}]}}";

var trackNames = [String]()

func parseData(JSONData: Data) {
    do {
        if let readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .allowFragments) as? [String: Any],
             let tracks = readableJSON["tracks"] as? [String: Any],
                 let items = tracks["items"] as? [[String: Any]] {
                    trackNames.append(contentsOf: items.map{$0["name"] as! String})
                    print(trackNames) // prints ["a", "b", "c"] 
                    //self.tableView.reloadData()
            }
    } catch {
        print(error)
    }
}

parseData(JSONData: json.data(using: .utf8)!)