iOS URLSession错误“JSON文本未以数组或对象开头,并且选项允许未设置片段。”

时间:2017-12-07 10:22:14

标签: php ios json swift

我目前正在进行一个项目,我必须将一些数据提交到PHP文件并从PHP获得返回。

问题

当我尝试使用iOS URLSession执行此操作时,我收到错误,

The data couldn’t be read because it isn’t in the correct format.
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.}

由于这个错误,我制作了一个示例php文件,其中我返回了我从Swift发送的值。并且仍然会收到此错误以及一些其他信息。

<NSHTTPURLResponse: 0x60400042e200> { URL: http://192.168.1.99/insertDataTest.php } { status code: 200, headers {
Connection = "Keep-Alive";
"Content-Length" = 5;
"Content-Type" = "application/json";
Date = "Thu, 07 Dec 2017 09:55:58 GMT";
"Keep-Alive" = "timeout=5, max=100";
Server = "Apache/2.4.10 (Raspbian)";

}}

到目前为止我做了什么

在这里我知道来自PHP的内容,Swift无法读取。 我正在从Swift发送一个5位数的字符串到PHP,因为我没有做任何事情就返回它,我得到5个数据的长度。我还手动将一个代码添加到php中,以便将头文件作为application / json。但仍然得到这个错误。我也从PHP发送json编码数据。

我的代码

夫特:

let postParameters = "{\"usermobilenum\":12345}"
request.httpBody = postParameters.data(using: String.Encoding.utf8)
let task = URLSession.shared.dataTask(with: request as URLRequest)
{
    data, response, error in
    if error != nil
    {
      print("error is \(String(describing: error))")
      return;
    }

    do
    {
      print(response!)
      let myJSON = try  JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
      if let parseJSON = myJSON
      {
          var msg : String!
          msg = parseJSON["message"] as! String?
          print(msg)

      }
    }
    catch
    {
      print(error.localizedDescription)
      print(error)
    }

}
task.resume()

PHP:

<?php
header("Content-Type: application/json");
if($_SERVER["REQUEST_METHOD"]=="POST")
{
    $data =json_decode(file_get_contents('php://input'),true);
    $userPhone = $data["usermobilenum"];
    echo json_encode($userPhone);
    mysqli_close($connect);
}
else
{
    echo json_encode("Failed in POST Method");
}

?>

我不知道这是什么原因。我确实试图在互联网上找到解决方案,但没有运气。请帮忙。我正在使用最新的Swift版本。

1 个答案:

答案 0 :(得分:1)

幸运的是,我找到了解决自己问题的方法。我错过了解错误。正如它所说的“允许片段未设置的选项。”,我所做的是添加option .allowFragments。所以这次更换后的整条线,

let myJSON = try  JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary

我可以解决问题并获得PHP返回的答案。