2016-10-09 30 views
6

Tôi đã JSON tìm kiếm như thế này:Parse JSON phản ứng với Swift 3

{"posts": 
    [ 
    { 
    "id":"1","title":"title 1" 
    }, 
    { 
    "id":"2","title":"title 2" 
    }, 
    { 
    "id":"3","title":"title 3" 
    }, 
    { 
    "id":"4","title":"title 4" 
    }, 
    { 
    "id":"5","title":"title 5" 
    } 
    ], 
    "text":"Some text", 
    "result":1 
} 

Làm thế nào tôi có thể phân tích rằng JSON với Swift 3?

Tôi có điều này:

let url = URL(string: "http://domain.com/file.php")! 
let request = URLRequest(url: url) 

let task = URLSession.shared.dataTask(with: request) { data, response, error in 
    guard let data = data else { 
     print("request failed \(error)") 
      return 
    } 

    do { 
     if let json = try JSONSerialization.jsonObject(with: data) as? [String: String], let result = json["result"] { 
      // Parse JSON 
     } 
    } catch let parseError { 
     print("parsing error: \(parseError)") 
     let responseString = String(data: data, encoding: .utf8) 
      print("raw response: \(responseString)") 
     } 
    } 
    task.resume() 
} 

Trả lời

11

Sử dụng này để phân tích dữ liệu của bạn:

let url = URL(string: "http://domain.com/file.php") 
URLSession.shared.dataTask(with:url!, completionHandler: {(data, response, error) in 
    guard let data = data, error == nil else { return } 

    do { 
     let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:Any] 
     let posts = json["posts"] as? [[String: Any]] ?? [] 
     print(posts) 
    } catch let error as NSError { 
     print(error) 
    } 
}).resume() 

Sử dụng guard để kiểm tra xem bạn có dữ liệu và lỗi đó là trống rỗng.

+0

Tôi bị trống phản hồi trong ứng dụng. '... 2016-10-09 05: 02: 28.148947 Tên ứng dụng [15760: 381303] [] tcp_connection_get_statistics DNS: 16ms/29ms kể từ khi bắt đầu, TCP: 178ms/223ms kể từ khi bắt đầu, TLS: 0ms/0ms kể từ khi bắt đầu [: ] '. Bạn cũng biết cách nhận các giá trị 'text' và' response'? Cảm ơn – user3051755

+0

@ user3051755, bài đăng trả về một loạt từ điển (xem json của bạn) vì vậy tôi đã cập nhật cho phép bài đăng = json ["bài đăng"] dưới dạng? [[Chuỗi: Bất kỳ]] ?? []. Hãy thử mã mới thay thế và nó sẽ làm việc cho bạn. –

+0

Cảm ơn, bây giờ nó hoạt động cho 'bài viết'! Làm thế nào tôi cũng có thể nhận được các giá trị của 'text' và' result'? Tôi đã thử 'let text = json [" text "] là? [String: String] in (văn bản) 'nhưng nó in' nil'. – user3051755

0

Bởi vì cấu trúc dữ liệu của bạn trong kiểm tra json nên "[String: AnyObject]". Giá trị "posts" của khóa json là kiểu Array.

1

Trong nhanh chóng 3.0 cho phương thức GET:

var request = URLRequest(url: URL(string: "Your URL")!)   

    request.httpMethod = "GET" 
    let task = URLSession.shared.dataTask(with: request) { data, response, error in 
     guard let data = data, error == nil else {             // check for fundamental networking error 
      print("error=\(String(describing: error))") 
      return 
     } 

     if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {   // check for http errors 
      print("statusCode should be 200, but is \(httpStatus.statusCode)") 
      print("response = \(String(describing: response))") 
     } 

     let responseString = String(data: data, encoding: .utf8) 
     print("responseString = \(String(describing: responseString))") 
    } 
    task.resume() 

Trong nhanh chóng 3.0 cho phương thức POST:

var request = URLRequest(url: URL(string: "Your URL")!) 

    request.httpMethod = "POST" 
    let postString = "user_name=ABC" // Your parameter 
    request.httpBody = postString.data(using: .utf8) 
    let task = URLSession.shared.dataTask(with: request) { data, response, error in 
     guard let data = data, error == nil else {             // check for fundamental networking error 
      print("error=\(String(describing: error))") 
      return 
     } 

     if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {   // check for http errors 
      print("statusCode should be 200, but is \(httpStatus.statusCode)") 
      print("response = \(String(describing: response))") 
     } 

     let responseString = String(data: data, encoding: .utf8) 
     print("responseString = \(String(describing: responseString))") 
    } 
    task.resume() 
-2

DISTANCE - KHÓ KHĂN API ======== ================>

class ViewController: UIViewController { 

    var get_data = NSMutableData() 

    var get_dest = NSArray() 

    var org_add = NSArray() 

    var row_arr = NSArray() 



    var ele_arr = NSArray() 

    var ele_dic = NSDictionary() 

    var dist_dic = NSDictionary() 

    var dur_dic = NSDictionary() 

    override func viewDidLoad() { 

     super.viewDidLoad() 

     // Do any additional setup after loading the view, typically from a nib. 

     getmethod() 

    } 



    func getmethod() 

    { 

     let url_str = URL(string: "https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&departure_time=1408046331&origins=37.407585,-122.145287&destinations=37.482890,-122.150235") 

     let url_req = URLRequest(url: url_str!) 

     let task = URLSession.shared.dataTask(with: url_req) { (data, response, error) in 

      if let my_data = data 

      { 

       print("my data is----->",my_data) 

       do 

       { 

        self.get_data.append(my_data) 

        let jsondata = try JSONSerialization.jsonObject(with: self.get_data as Data, options: [])as! NSDictionary 

        print("json data is--->",jsondata) 



      self.get_dest = jsondata.object(forKey: "destination_addresses")as! NSArray 



      let get_dest1:String = self.get_dest.object(at: 0) as! String 

        print("destination is--->",get_dest1) 

      self.org_add = jsondata.object(forKey: "origin_addresses")as! NSArray 



      let get_org:String = self.org_add.object(at: 0)as! String 

        print("original address is--->",get_org) 



      self.row_arr = jsondata.object(forKey: "rows")as! NSArray 

      let row_dic = self.row_arr.object(at: 0)as! NSDictionary 



      self.ele_arr = row_dic.object(forKey: "elements")as! NSArray 



      self.ele_dic = self.ele_arr.object(at: 0)as! NSDictionary 



      self.dist_dic = self.ele_dic.value(forKey: "distance")as! NSDictionary 

      print("distance text is--->",self.dist_dic.object(forKey: "text")as! String) 

      print("distance value is--->",self.dist_dic.object(forKey: "value")as! Int) 



      // self.ele_dic = self.ele_arr.object(at: 1)as! NSDictionary 



      self.dur_dic = self.ele_dic.value(forKey: "duration")as! NSDictionary 



      print("duration text--->",self.dur_dic.value(forKey: "text")as! String) 

      print("duration value--->",self.dur_dic.value(forKey: "value")as! Int) 



       print("status---->",self.ele_dic.object(forKey: "status")as! String) 



       } 

       catch 

       { 

        print("error is--->",error.localizedDescription) 

       } 

      } 

     };task.resume() 



    }