2016-08-29 10 views
0

これは私のコードです:HTTP GETリクエストから返されたJSONを処理する方法 - Swift?

 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() 

私のアプリは、JSONにデータベースから配列を解析するPHPファイルからJSONを取得しechoを使用してそれを返すと、それは以下の2行を返す:

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

を私はjsonの説明を印刷するとき、私が最初にを印刷するとき、私は、私がjsonNSArrayにキャストしようとしたnil

取得します私は良いのですが、アプリはif文if let parseJSON = jsonに到達したとき、私はNSDictionaryのにjson[0]の結果をキャストしようとしたとき、まだ私はそれからnilを取得します

それはキャッチに入り、それがいずれかを印刷していない最初の行を取得エラー、私はなぜか分からないのですか?

この私の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"; 
} 
?> 

だから私の要求または要求の処理に問題がありますか?

+0

データを(文字列に変換して)印刷できますか? 'json'はNSDictionaryまたはNSArrayを意味しますか? – Larme

+0

@Larme実際にはそれは無用です。私はそれを印刷します。はい、NSDictionaryになります。 – Zizoo

+0

@Larme JSONはDBから複数の行を返しますが、問題にはなりませんでしたか? – Zizoo

答えて

2

JSONは[String:String]ディクショナリの配列です。

JSON文字列で[]は配列を表し、{}は辞書を表します。

GETがデフォルトモードであるため、URLRequestは不要です。 .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() 
+0

swiftを使用するHTTPリクエストに慣れていないので、 – Zizoo

関連する問題