首页 文章

在Swfit 3.0中解析JSON将NSArray转换为NSDictionary错误

提问于
浏览
-5

我正在尝试将JSON Url解析为UICollectionView,但我一直无法将'__NSArrayI'(0x1010ebd88)类型的值转换为'NSDictionary'(0x1010ec288) . 我尝试加载数据时出错 . 我正在使用xcode 8和Swift 3.0 . 任何人都可以看到我得到的错误以及如何解决它?不知道从哪里开始 .

let link = "http://www.flickr.com/services/feeds/photos_public.gne?tags=swimming&format=json&nojsoncallback=1"

    let urlString = link

    let url = URL(string: urlString)
    URLSession.shared.dataTask(with:url!) { (data, response, error) in
        if error != nil {
            print(error)
        } else {
            do {

                let parsedData = try JSONSerialization.jsonObject(with: data!, options: []) as! [String:Any]
                let currentConditions = parsedData["items"] as! [String:Any]

                print(currentConditions)

                let currentItem = currentConditions["link"] as! [String:Any]
                print(currentItem)

            } catch let error as NSError {
                print(error)
            }
        }

        }.resume()

编辑:好的所以我已经走了这么远,现在在“items”中,还有另一个字符串,我需要提取到一个数组 . 在项目中,有几个“link =”我需要一个数组中的链接,但不知道如何把它拿出来 . 当我打印键值时,项目会显示,但它似乎只是一个长字符串,而不是数组或字典 . 任何建议?谢谢,

let urlString = link
    var itemArray: Any?
    var parsedData: [String:Any] = ["":""]

    let url = URL(string: urlString)
    URLSession.shared.dataTask(with:url!) { (data, response, error) in
        if error != nil {
            print(error)
        } else {
            do {

                parsedData = try JSONSerialization.jsonObject(with: data!, options: []) as! [String:Any]
                itemArray = parsedData["items"] as! [[String:Any]]



                for (key, value) in parsedData {
                    print("\(key) - \(value) ")
                }



            } catch let error as NSError {
                print(error)
            }
        }

        }.resume()

    guard let images_array = parsedData["items"] as? NSArray else
    {
        print("error2")
        return
    }

2 回答

  • 0

    正如评论中提到的 parsedData["items"] 是一个数组,键 link 的值是一个字符串,所以你需要使用一个循环:

    typealias JSONDictionary = [String:Any] // for convenience
    
    ...
    
    if let parsedData = try JSONSerialization.jsonObject(with:data!, options: []) as? JSONDictionary {
            // print(jsonData)
            guard let currentConditions = parsedData["items"] as? [JSONDictionary] else { return }
            for condition in currentConditions {
                print(condition["link"] as! String)
            }
        }
    }
    
  • 0

    您可以使用:由于项目中的数据是字典数组而链接不在内部数组中,因此它是主字典,因此您可以通过将链接作为键传递来轻松获得此字典 .

    let link = "http://www.flickr.com/services/feeds/photos_public.gne?tags=swimming&format=json&nojsoncallback=1"
    
            let urlString = link
    
            let url = URL(string: urlString)
            URLSession.shared.dataTask(with:url!) { (data, response, error) in
                if error != nil {
                    print(error)
                } else {
                    do {
    
                        let parsedData = try JSONSerialization.jsonObject(with: data!, options: []) as! [String:Any]
                        let currentConditions = parsedData["items"] as! [[String:Any]]
    
                        print(currentConditions)
    
                        let currentItem = parsedData["link"] as! String
                        print(currentItem)
    
                    } catch let error as NSError {
                        print(error)
                    }
                }
    
                }.resume()
    

相关问题