2017-03-07 3 views
-2

스위프트 3의 PHP로 mySQL에서 GPS 위치를 가져와야합니다. 데이터를 가져 오기위한 코드를 작성하려고했지만 여전히 작동하지 않습니다. 조언 해 주시겠습니까? PHP에서Swift 3에서 JSON 데이터를 구문 분석하는 방법은 무엇입니까?

JSON 데이터 :

[{ "ID": "3752", "위도": "11.2222", "경도": "111.2222", "속도": "0.000000", " 볼트 ":"3.97 ","비율 ":"87.000000 ","날짜 ":"2017년 3월 7일 22시 53분 32초 "}]

스위프트 3 코드 :

import UIKit 
//-------- import google map library --------// 
import GoogleMaps 
import GooglePlaces 
class ViewController: UIViewController , GMSMapViewDelegate { 
    var placesClient: GMSPlacesClient! 
    override func viewDidLoad() { 
     super.viewDidLoad()  
     var abc : String = String()   
     //-------- Google key for ios --------// 
     GMSServices.provideAPIKey("XXXXXXXXXX") 
     GMSPlacesClient.provideAPIKey("XXXXXXXXX") 
     //--------set URL --------// 
     let myUrl = URL(string: "http://www.myweb/service.php");   
     var request = URLRequest(url:myUrl!)   
     request.httpMethod = "POST"   
     let postString = "";   
     request.httpBody = postString.data(using: String.Encoding.utf8);   
     let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in 
      if error != nil 
      { 
       print("error=\(error)") 
       return 
      }    
      // You can print out response object 
      print("response = \(response)")   

      do { 
       let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary 

       if let parseJSON = json {      
        // Now we can access value of latiutde 
        let latitude= parseJSON["latitude"] as? String //<---- Here , which i need latitude value 
        print("latitude = \(latitude)")  
       } 
      } catch { 
       print(error) 
      } 
     } 
     task.resume()  

} 

코드를 작성하려고했지만 디버그 출력에 오류가 표시됩니다.

let responseString = String(data: data, encoding: .utf8) 
    let str = String(data: data, encoding: .utf8) 
    let data2 = str?.data(using: String.Encoding.utf8, allowLossyConversion: false)! 

    do { 
     let json = try JSONSerialization.jsonObject(with: data2!, options: []) as! [String: AnyObject] 
     if let names = json["latitude"] as? [String] { 
      print(names) 
     } 
    } catch let error as NSError { 
     print("Failed to load: \(error.localizedDescription)") 
    }    

} 

오류 메시지 유형의 값을 캐스팅 할 수 없습니다 '__NSSingleObjectArrayI'(0x1065fad60) 'NSDictionary에'(0x1065fb288) 에.

+0

"작동하지 않음"을 정의하십시오. – rmaddy

+0

기타 : http://stackoverflow.com/q/38155436/2415822 – JAL

+1

a l a m o f i r e –

답변

0

기본 데이터의 'Swifty'액세스를 위해 json 개체를 Swift 표현으로 직접 캐스팅 해보세요. 그래서 당신은 모든 당신이 필요의 NSNumber 주변에 소란 당신이 [String: String] 객체 배열을해야 확실하지 않은 경우 등

guard let json = JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [[String: String]] else { return } 
guard json.count > 0 else { return } 
guard let lattitude = json[0]["lattitude"] else { return } 
print("Lattitude received: \(lattitude)") 

, 당신은 캐스트에 [String: Any]로 교체 할 수 있습니다 필요가 없습니다 lattitude를 읽을 때 옵션 캐스팅을 사용하여 유형을 확인하십시오. 연결된 옵션을 추가 한 다음 isEmpty을 확인하여 원하는 래티튜드 값이 잘못되었는지 여부를 확인할 수 있습니다.

코드에서 !을 거의 사용하지 말고, 선택 체인 및 가드 명령문에 더 의존하십시오.

Guard statement introduction

참고 : 한 줄 가드 문이 아주 상세하지 않고 매우 어려운 응용 프로그램을 디버깅 할 수 있습니다. 가드 문의 본문에 오류나 더 많은 디버그 인쇄를 던지십시오.

관련 문제