【问题标题】:How to handle JSON returned from HTTP GET request - Swift?如何处理从 HTTP GET 请求返回的 JSON - Swift?
【发布时间】:2017-01-05 05:00:15
【问题描述】:

这是我的代码:

        let myUrl = NSURL(string:"hostname/file.php");

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


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

        dispatch_async(dispatch_get_main_queue())
            {



                if(error != nil)
                {
                    //Display an alert message

                    return
                }



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

                    if let parseJSON = json { /* when the app reach here , will enter the catch and get out */

                        let userId = parseJSON["id"] as? String
                        print(userId)

                        if(userId != nil) 
                        {

                            NSUserDefaults.standardUserDefaults().setObject(parseJSON["id"], forKey: "id")
                            NSUserDefaults.standardUserDefaults().setObject(parseJSON["name"], forKey: "name")

                            NSUserDefaults.standardUserDefaults().synchronize()


                        } else {
                            // display an alert message
                                print("error")

                        }

                    }
                } catch
                {
                    print(error)
                }


        }



    }).resume()

我的应用程序从 php 文件中获取 JSON,该文件将数组从数据库解析为 JSON 并使用 echo 返回它,它返回以下 2 行:

[{"id":"1","name":"CIT","adminstrator_id":"1"},{"id":"2","name":"HelpDesk","adminstrator_id":"1"}]

当我打印json 的描述时,我得到nil

我尝试将 json 转换为 NSArray ,当我首先打印 json[0] 时,我得到了第一行,这很好,但是当我尝试将 json[0] 的结果转换为 NSDictionary 时,我仍然会得到 nil来自它

当应用程序到达 if 语句 if let parseJSON = json 时,它会进入 catch 并且它没有打印任何错误,我不知道为什么?

这是我的 php 代码:

    <?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "mydb";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 
$sql = "SELECT * FROM department";
$result = $conn->query($sql);
$rows = array();
if ($result->num_rows > 0) {
    // output data of each row
    while($r = $result->fetch_assoc()) {
        $rows[] = $r;
    }
    $conn->close();
    echo json_encode($rows);
} else {
    $conn->close();
    echo "0 results";
}
?>

那么问题是我的请求还是处理请求?

【问题讨论】:

  • 你能打印数据(转换成字符串)吗? json 是 NSDictionary 还是 NSArray?
  • @Larme 实际上它是 nil 我只是打印它,是的意味着是一个 NSDictionary
  • @Larme JSON 从 DB 返回多行,不会是问题吗?
  • JSON 无疑是一个数组(用方括号表示)
  • 问题是您的 JSON 是有效的,并且 NSJSONSerialization.JSONObjectWithData(data:options:) 有效,但演员 as? NSDictionary 将不起作用,因为它是顶级的 NSArray

标签: ios json swift


【解决方案1】:

JSON 是 [String:String] 字典的数组。

在 JSON 字符串中,[] 代表一个数组,{} 代表一个字典。

不需要 URLRequest,因为GET 是默认模式。 .MutableContainers 也不需要,因为这些值只是被读取的。

考虑 JSON 返回多条记录。此代码仅打印 idname 的所有值。

let myUrl = NSURL(string:"hostname/file.php")!
NSURLSession.sharedSession().dataTaskWithURL(myUrl) { (data, response, error) in
  if error != nil {
    print(error!)
  } else {
    do {
      if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [[String:String]] {
        for entry in json {
          if let userId = entry["id"], name = entry["name"] {
            print(userId, name)
          }
        }
      } else {
        print("JSON is not an array of dictionaries")
      }
    } catch let error as NSError {
      print(error)
    }
  }
}.resume()

【讨论】:

  • 谢谢,这正是我需要的,因为我不熟悉使用 swift 的 HTTP 请求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
相关资源
最近更新 更多