Домен ошибки = NSCocoaErrorDomain Code = 3840 «Текст JSON не начинался с массива или объекта

Целью этого кода является отправка данных в базу данных SQL с использованием сценария PHP.
Но когда я пытаюсь запустить его, я получаю следующую ошибку:

Ошибка Domain = NSCocoaErrorDomain Code = 3840 «Текст JSON не начинался с массива или объекта и опции, позволяющей не устанавливать фрагменты.» UserInfo = {NSDebugDescription = Текст JSON не начинался с массива или объекта, и параметр, позволяющий не устанавливать фрагменты.}

Это мой код:

    // Send userdata to server side
let myURL = NSURL(string: "http://localhost/userRegister.php");
let request = NSMutableURLRequest(URL:myURL!);
request.HTTPMethod = "POST";
let postString = "email=\(userEmail)&password=\(userPassword)";
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding);

// Create the task and execute it

let task = NSURLSession.sharedSession().dataTaskWithRequest(request){
data,response, error in

if error != nil{
print("error=\(error)")
return
}

var err: NSError?

do
{
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary

if let parseJSON = json {

var resultValue = parseJSON["status"] as? String
print("result: \(resultValue)")

var isUserRegisterd:Bool = false;
if(resultValue=="Success")
{
isUserRegisterd = true
}

var messageToDisplay: String = (parseJSON["message"] as? String)!

if(!isUserRegisterd)
{
messageToDisplay = (parseJSON["message"] as? String)!
}

dispatch_async(dispatch_get_main_queue(), {

var myAlert = UIAlertController(title: "Alert", message: messageToDisplay, preferredStyle: UIAlertControllerStyle.Alert);
let okAction = UIAlertAction(title: "Oké", style: UIAlertActionStyle.Default){
action in
self.dismissViewControllerAnimated(true, completion: nil);

}
myAlert.addAction(okAction);
self.presentViewController(myAlert, animated: true, completion: nil);

});



}

}

catch
{
print(error)
}

}

task.resume()

В чем здесь проблема?

0

Решение

Эта ошибка обычно означает, что NSData не содержит действительный JSON.

Вы должны посмотреть на response и строковое представление data потому что если сервер столкнулся с проблемой, он, скорее всего, вернул бы statusCode в NSHTTPURLResponse (где 200 означает, что все было в порядке, RFC 2616 описывает, что означают другие коды ошибок) и NSData скорее всего содержит HTML или текст, описывающий природу проблемы:

do {
// your code where you `try` parsing the JSON response goes here
} catch {
print(error)

if data != nil {
let string = String(data: data!, encoding: NSUTF8StringEncoding)
print(string)
}

print(response)
}

Когда вы смотрите на NSURLResponse а также NSData объекты, вы будете гораздо чаще диагностировать проблему.

Кстати, я мог бы посоветовать указать Content-Type запроса. Кроме того, я бы предложил процентное экранирование адреса электронной почты и пароля. Последнее важно, потому что, если значения содержат специальные символы (например, + а также & проблемы), данные не будут корректно обработаны сервером.

let url = NSURL(string: "http://localhost/userRegister.php")
let request = NSMutableURLRequest(URL: url!)
request.HTTPMethod = "POST"request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
let encodedEmail = userEmail.stringByAddingPercentEncodingForFormUrlencoded()
let encodedPassword = userPassword.stringByAddingPercentEncodingForFormUrlencoded()
let postString = "email=\(encodedEmail)&password=\(encodedPassword)"request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)

куда

extension String {

/// Percent escape value to be added to a HTTP request
///
/// This percent-escapes all characters besize the alphanumeric character set and "-", ".", "_", and "*".
/// This will also replace spaces with the "+" character as outlined in the application/x-www-form-urlencoded spec:
///
/// http://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithm
///
/// - returns: Return percent escaped string.

func stringByAddingPercentEncodingForFormUrlencoded() -> String? {
let allowedCharacters = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._* ")

return stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacters)?.stringByReplacingOccurrencesOfString(" ", withString: "+")
}
}

Кроме того, вы можете создать набор символов из допустимых символов, начиная с URLQueryAllowedCharacterSet, но вам все равно придется удалить несколько символов, так как в противном случае некоторые символы пропускаются без экранирования (например, +). Увидеть https://stackoverflow.com/a/35912606/1271826.

Или вы можете использовать такие рамки, как Alamofire который заботится об этих деталях для вас.

2

Другие решения

В моем случае даже следующий код вызывал эту ошибку, добавляя дополнительные // косые черты в начале вывода.

$arr = array("status" => 1, "msg" => "Your message goes here!");
echo json_encode($arr);

Причина была в том, что эти дополнительные символы печатались в другом файле, который я включил в этот файл.

0