Search code examples
iosswiftalamofireswifty-json

iOS Swift JSON retrieving data issue


What I would like to do: Retrieve in my static cell Labels the returns of my JSON Query.

What is my problem: I can not do it. Can not return single value to change my label.

What did I try: First of all, I install the Alamofire and SwiftyJSON library. Secondly I did my PHP Script which result in correct JSON Data. I create the labels in my storyboard and created the @IBOutlet UILabel in my UITableViewController. Thirdly, I did my Alamofire request and I can get the output of my whole Data.

What I can not do: I can not get the individuals fields to replace my labels. I would like to retrieve [username] [gender] [location] [birthday] [mobilephone] [signature] from my JSON and replace my labels with this return. But when I would like to retrieve [mobilephone] for example, I got nil result.

I also think I got a problem with my JSON as it does not seem to return Array but only Dictionary

my tableviewcontroller

          import UIKit
import Alamofire
import SwiftyJson

class PersonalDetails: UITableViewController {

    required init(coder aDecoder: NSCoder) {
        println("init PersonalDetails")
        super.init(coder: aDecoder)
    }

    deinit {
        println("deinit PersonalDetails")
    }

    var usersData = [PersonalDetailsData]()

    @IBOutlet weak var dataUsername: UILabel!
    @IBOutlet weak var dataGender: UILabel!
    @IBOutlet weak var dataArea: UILabel!
    @IBOutlet weak var dataBirthday: UILabel!
    @IBOutlet weak var dataMobilePhone: UILabel!
    @IBOutlet weak var dataSignature: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
        var username = prefs.valueForKey("USERNAME") as NSString
//load and parse the JSON into an array
        Alamofire.request(.GET, "http://mywebsite/app/data/jsonpersodata.php", parameters: ["username": username]).responseJSON { (request, response, data, error) in

            let swiftyJSONObject = JSON(data!)
            if (error != nil)
            {
                // got an error in getting the data, need to handle it
                println("error calling GET usersdata")
                println(error)
            }
            else if let data: AnyObject = data
            {
                // handle the results as JSON, without a bunch of nested if
                let userdata = JSON(data)
                if let mobilephone: String = userdata [0]["mobilephone"].stringValue {
                self.dataMobilePhone.text = mobilephone
                }

                               }

        }

    }



    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
           }

    @IBAction func logoutTapped(sender : UIButton) {

        let appDomain = NSBundle.mainBundle().bundleIdentifier
        NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain!)

        self.performSegueWithIdentifier("logout", sender: self)
    }


    }

my class

import Foundation

class PersonalDetailsData: NSObject {

    var dataUsername:String?
    var dataGender:String?
    var dataArea:String?
    var dataBirthday:String?
    var dataMobilePhone:String?
    var dataSignature:String?
}

my json

[
  {
    "username": "username1",
    "gender": "?",
    "location": "??",
    "birthday": "1983/01\/16",
    "mobilephone": "136777777",
    "signature": null
  }
]

my php

<?php
header('Content-type: application/json');
/* include db.config.php */
include_once("config.php");
// Get user id
$id = isset($_GET['username']) ? mysql_real_escape_string($_GET['username']) : “”;

if(empty($id)){
    $data = array ("result" => 0, "message" => 'Wrong user id');
} else {
// get user data
$sql = mysql_query("SELECT username, gender, location, birthday, mobilephone, signature FROM users WHERE username='$id'");

$data = array ();

 while ($row = mysql_fetch_array($sql, MYSQL_ASSOC)) {
        $row_array['username'] = $row['username'];
        $row_array['gender'] = $row['gender'];
        $row_array['location'] = $row['location'];
        $row_array['birthday'] = $row['birthday'];
        $row_array['mobilephone'] = $row['mobilephone'];
        $row_array['signature'] = $row['signature'];
        //push the values in the array
        array_push($data,$row_array);
 }
 echo json_encode($data);

mysql_close($conn);
/* JSON Response */
}
?>

Solution

  • The JSON you're returning is actually an array, not a direct value of the object you're expecting (see the [ and ] in your raw JSON? They represent an array).

    Here's what you could do to parse the first item in your JSON array:

                // handle the results as JSON, without a bunch of nested if
                let userdata = JSON(data)
                if let mobilephone: String = userdata[0]["mobilephone"].string {
                    self.dataMobilePhone.text = mobile phone
                }
                // etc.