解析 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的主要内容,如果未能解决你的问题,请参考以下文章
如何使用json解析android在listview中获取图像