Paul Heinemeyer Paul Heinemeyer - 1 year ago 78
Swift Question

Error when trying to get Json data from php script

I get the following error when i try to get data. In the internet i read that its because the php script is invalid and don't return json data. But the php script runs fine and outputs the right data.

Error Message :

Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}

I tried to allow fragments but then i get just another error message.

Here is the swift code where i try to get the data :

let myUrl = NSURL(string: "")

let request = NSMutableURLRequest(URL: myUrl!)
request.HTTPMethod = "POST"

let postString = "userEmail=\(userEmail!)&userPassword=\(userPassword!)"

request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)

NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in

if(error != nil)
var alert = UIAlertController(title: "Achtung", message: error?.localizedDescription, preferredStyle: UIAlertControllerStyle.Alert)

let action = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil)


self.presentViewController(alert, animated: true, completion: nil)
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary

if let parseJSON = json {

let userId = parseJSON["userId"] as? String
if( userId != nil)
let mainView = self.storyboard?.instantiateViewControllerWithIdentifier("main") as! FlickrPhotosViewController

let mainPageNavi = UINavigationController(rootViewController: mainView)
//open mainView
let appdele = UIApplication.sharedApplication().delegate
appdele?.window??.rootViewController = mainPageNavi

} else {
let userMassage = parseJSON["message"] as? String
let myAlert = UIAlertController(title: "Alert", message: userMassage, preferredStyle: UIAlertControllerStyle.Alert);

let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)
self.presentViewController(myAlert, animated: true, completion: nil)


} catch{


and this is the important part of the php file :

$userSecuredPassword = $userDetails["user_password"];

$userSalt = $userDetails["salt"];

if($userSecuredPassword === sha1($userPassword . $userSalt))

$returnValue["userFirstName"] = $userDetails["first_name"];

$returnValue["userLastName"] = $userDetails["last_name"];

$returnValue["userEmail"] = $userDetails["email"];

$returnValue["userId"] = $userDetails["user_id"];
} else {

$returnValue["message"]="User not found";

echo "failed";

echo json_encode($returnValue);


echo json_encode($returnValue);

$returnValue returns this when i print it:
Array ( [status] => 200 [userFirstName] => Paul [userLastName] => Heinemeyer [userEmail] => paul_heine [userId] => 63 )

Answer Source

When you properly format your PHP code, you will see, that in the else part you have

echo "failed";
echo json_encode($returnValue);

which results in


As the error message already says, this "JSON text did not start with array or object ..."

Maybe there is similar output for the other if part.