JSON et Swift

Bonsoir,


Pour parser des données JSON, j'utilise le code donné dans la réponse ci-dessous :


 


http://stackoverflow.com/questions/31805045/how-to-parse-json-in-swift-2-0-using-nsurlsession


 


Cependant je n'arrive pas à  les affecter à  une variable afin de remplir une TableView !


Après le print(json) qui fonctionne bien (je vois bien les données)


j'essaye :



self.mDataArray = json["results"] as! NSArray

mDataArray est déclaré comme ceci :



class AfficherDataController: UIViewController {

var mDataArray = NSArray() 

 dans ViewDidLoad :



self.jsonParser
self.tableView.reloadData()

mais rien !


 


Merci.


Réponses

  • LarmeLarme Membre
    janvier 2016 modifié #2

    Il va falloir un peu plus de code.


    Car plusieurs problèmes peuvent avoir lieu :


    -Tu as une méthode de WS asynchrone: problème lors de l'affectation, ou reloadData appelé à  un mauvais moment.

    -json["results"] est en réalité en Dictionnaire et pas un Array


    -json["results"] n'est pas ce qu'il faut appeler sur json. problème d'analyse de ta réponse JSON.


  • heliohelio Membre
    janvier 2016 modifié #3

    Merci, voici le code complet (j'ai juste supprimé l'url car elle contient une clé api)



    import UIKit

    enum JSONError: String, ErrorType {
    case NoData = "ERROR: no data"
    case ConversionFailed = "ERROR: conversion from JSON failed"
    }

    class AfficheViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var tableView = UITableView()
    var mArray = NSMutableArray()

    override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self

    self.navigationController?.setNavigationBarHidden(false, animated: true)

    self.configureView()

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

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()
    }

    func configureView() {
    tableView.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height)
    tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")
    self.view.addSubview(self.tableView)
    }

    func jsonParser() {
    let urlPath = " "
    guard let endpoint = NSURL(string: urlPath) else { print("Error creating endpoint");return }
    let request = NSMutableURLRequest(URL:endpoint)
    NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) -> Void in
    do {
    guard let dat = data else { throw JSONError.NoData }
    guard let json = try NSJSONSerialization.JSONObjectWithData(dat, options: []) as? NSDictionary else { throw JSONError.ConversionFailed }
    print(json)
    self.mArray = json["results"] as! NSMutableArray
    } catch let error as JSONError {
    print(error.rawValue)
    } catch {
    print(error)
    }
    }.resume()

    }


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

    // MARK: - Table view data source

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return mArray.count
    }


    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell")! as UITableViewCell
    cell.textLabel?.text = "test"
    // Configure the cell...
    return cell
    }

  • Après self.mArray = json["results"] as! NSMutableArray, récupère la main queue et fais un reloadData.


  • LexxisLexxis Membre
    janvier 2016 modifié #5

    - Grillé par Larme -


     


    Je ne vois pas bien où les données sont renseignées dans 'myArray'. De plus j'essaierai de faire appel à  "reloadData" une fois les données récupérées (après le 'print(son)' pour faire un test par exemple).


    Si tu enchaà®nes les appels à  'self.jsonParser' puis 'self.tableView.reloadData()' il y a de fortes chances que les données n'aient pas eu le temps d'être rapatriées.



  • func jsonParser() {
    let urlPath = " "
    guard let endpoint = NSURL(string: urlPath) else { print("Error creating endpoint");return }
    let request = NSMutableURLRequest(URL:endpoint)
    let qualityOfServiceClass = QOS_CLASS_BACKGROUND
    let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
    dispatch_async(backgroundQueue, {
    NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) -> Void in
    do {
    guard let dat = data else { throw JSONError.NoData }
    guard let json = try NSJSONSerialization.JSONObjectWithData(dat, options: []) as? NSDictionary else { throw JSONError.ConversionFailed }
    print(json)
    dispatch_async(dispatch_get_main_queue(), { () -> Void in
    self.mArray = json["results"] as! NSMutableArray
    self.tableView.reloadData()
    })
    } catch let error as JSONError {
    print(error.rawValue)
    } catch {
    print(error)
    }
    }.resume()
    })
    }

    Effectivement ça fonctionne mieux comme ça,


    merci à  vous.


Connectez-vous ou Inscrivez-vous pour répondre.