解析 JSON 并提取图像的 URL

Posted

技术标签:

【中文标题】解析 JSON 并提取图像的 URL【英文标题】:Parsing JSON and extracting URLS for images 【发布时间】:2017-02-14 00:24:15 【问题描述】:

我的代码有问题,我已将 JSON 解析到获取图像 URL 的级别。我正在尝试使用 URL 给我的图像填充集合视图单元格中的图像视图。这是我的代码。

import UIKit

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource 

    var media = NSDictionary()

    @IBAction func SearchBTN(_ sender: AnyObject) 
        getPictures()

    
    @IBOutlet weak var CollectionView: UICollectionView!
    @IBOutlet weak var searchBoxTF: UITextField!



    func getPictures()
        let url = URL(string: "http://www.flickr.com/services/feeds/photos_public.gne?tags=baseball&format=json&nojsoncallback=1")
        let session = URLSession(configuration: URLSessionConfiguration.default)
        let task = URLSession.shared.dataTask(with: url!)(data, response, error) in
            if error != nil
            
                print("Error")
            
            else
            
                if let content = data
                
                    do
                    
                        let myJSON = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as? AnyObject
                    //print(myJSON)
                        if let images = myJSON?["items"] as? [[String: AnyObject]]
                        
                            var media = UIImage()
                            for media in images
                            
                               // let media = self.media
                                print(media["media"])

                            


                        
                    

                    catch
                    

                    
                
            
        
        task.resume()
    

    override func viewDidLoad() 
        super.viewDidLoad()

        CollectionView.delegate = self
        CollectionView.dataSource = self
        // Do any additional setup after loading the view, typically from a nib.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return media.count
    

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCell", for: indexPath) as! ImageCollectionViewCell
        cell.imageView.image = media[indexPath.item]as? UIImage
        return cell
    


【问题讨论】:

Json 不是图像。 cell.imageView.image = media[indexPath.item]as? UIImage ,您正在尝试将 JSON 值设置为 UIImage ? JSON 结果包含我试图获取的 jpeg 图像的 URL,我的代码将解析 JSON 以获取 URL。我无法提取 URL,因此我可以使用它来填充包含 UIimageView 的 collectionViewcell,以便我可以查看图像。你有什么建议吗? 检查我的答案我已经更新了你需要知道的一切。 @user7454867 如果您仍在寻找解决方案,请检查下面的答案,否则您将在此链接中找到该项目github.com/huilgolAni19/ParsingJSON 【参考方案1】:

您的 JSON 响应不是图像。

cell.imageView.image = media[indexPath.item]as? UIImage,您正在尝试将 JSON 值设置为 UIImage。

http://www.flickr.com/services/feeds/photos_public.gne?tags=baseball&format=json&nojsoncallback=1

此 URL 将带有 URL's 的 JSON 响应返回到实际图像

然后您需要从那些实际的图片网址中download the UIImage。

编辑:(根据您在评论中的问题)

1:您会收到NSDictionary JSON 响应。

2:在NSDictionary 中,您会得到一个带有“items”的NSArray,(objectForKey:"items")

3:在 NSArray 内部,每个图像对象都有一个对象,即 NSDictionary

4:最后,在每个图像对象NSDictionary 中,都有一个名为“media”(objectForKey:“media”)的 url,它是图像的最终 URL。然后您需要根据该 URL 下载 UIImage

我不会在 Swift 中编码,所以我不想给你错误的代码示例,There are many threads 如何从 JSON 响应中获取 URL 或任何值。

【讨论】:

您具体指的是另一个线程的哪一部分?您将如何收集 URL 以便您可以下载它们。我正在阅读您在链接中附加的一些内容,我不明白链接所解释的过程。 你应该阅读我写的关于回复的内容。首先你得到NSDictionary JSON 响应。在NSDictionary 里面,你会得到一个NSArray 的“项目”。在 NSArray 内部,每个图像都有一个对象,即 NSDictionary 。最后,在每个图像对象NSDictionary 中都有一个“url”objectForKey“media”,这是您对图像的最终URL。然后您需要根据该 URL 下载UIImage【参考方案2】:

试试这个代码,你会得到预期的输出

import UIKit

private let reuseIdentifier = "Cell"

class MCollectionViewController: UICollectionViewController 

    var arraImage: [String] = [String]()


    override func viewDidLoad() 
        super.viewDidLoad()

        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        self.collectionView!.backgroundColor = UIColor.whiteColor()
        RestAPIManager.sharedInstance.getServerData  (Json) -> Void in
            //print("Response = \(Json)")
            let array = Json["items"].arrayValue
            for item in array 
                print("\(item["media"]["m"])")
                self.arraImage.append(item["media"]["m"].stringValue)
                dispatch_async(dispatch_get_main_queue(),  () -> Void in
                    self.collectionView!.reloadData()
                )
            
        
    


    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    
    */

    // MARK: UICollectionViewDataSource

    override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int 
        // #warning Incomplete implementation, return the number of sections
        return 1
    


    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        // #warning Incomplete implementation, return the number of items
        return arraImage.count
    

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize 

        let padding =  10
        let collectionViewSize = collectionView.frame.size.width - CGFloat(padding)

        return CGSizeMake(collectionViewSize/2, collectionViewSize/2)

    
    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 

        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! CollectionViewCell

        if let url: NSURL = NSURL(string: arraImage[indexPath.row]) 
            cell.imageView.sd_setImageWithURL(url)
        
        return cell
    

    // MARK: UICollectionViewDelegate

    /*
    // Uncomment this method to specify if the specified item should be highlighted during tracking
    override func collectionView(collectionView: UICollectionView, shouldHighlightItemAtIndexPath indexPath: NSIndexPath) -> Bool 
        return true
    
    */

    /*
    // Uncomment this method to specify if the specified item should be selected
    override func collectionView(collectionView: UICollectionView, shouldSelectItemAtIndexPath indexPath: NSIndexPath) -> Bool 
        return true
    
    */

    /*
    // Uncomment these methods to specify if an action menu should be displayed for the specified item, and react to actions performed on the item
    override func collectionView(collectionView: UICollectionView, shouldShowMenuForItemAtIndexPath indexPath: NSIndexPath) -> Bool 
        return false
    

    override func collectionView(collectionView: UICollectionView, canPerformAction action: Selector, forItemAtIndexPath indexPath: NSIndexPath, withSender sender: AnyObject?) -> Bool 
        return false
    

    override func collectionView(collectionView: UICollectionView, performAction action: Selector, forItemAtIndexPath indexPath: NSIndexPath, withSender sender: AnyObject?) 

    
    */


我还附上了链接,您可以在其中找到项目here

【讨论】:

你应该提到代码至少需要两个第三方库 @vadian 是的,所有的库文件都在项目中,我附上了链接检查一下

以上是关于解析 JSON 并提取图像的 URL的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 错误中解析 JSON 图像 url

无法在swift 3中解析Json?

IOS JSON解析包含多个数组

如何使用json解析android在listview中获取图像

Jmeter(三十四)_Beanshell解析并提取json响应

如何解析URL并提取所需的子字符串