【问题标题】:Parse JSON response with Swift 3使用 Swift 3 解析 JSON 响应
【发布时间】:2017-02-17 17:53:57
【问题描述】:

我的 JSON 看起来像这样:

{"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
}

如何使用 Swift 3 解析 JSON?

我有这个:

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

【问题讨论】:

    标签: ios json swift swift3


    【解决方案1】:

    使用它来解析您的数据:

    let url = URL(string: "http://example.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()
    

    使用guard检查你是否有数据并且那个错误是空的。

    Swift 5.x 版本

    let url = URL(string: "http://example.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 {
            print(error)
        }
    }).resume()
    

    【讨论】:

    • 我在应用程序中得到空响应。 ...2016-10-09 05:02:28.148947 App Name[15760:381303] [] tcp_connection_get_statistics DNS: 16ms/29ms since start, TCP: 178ms/223ms since start, TLS: 0ms/0ms since start [:]。您是否还知道如何获取 textresponse 值?谢谢
    • @user3051755,posts 返回一个字典数组(见你的 json)所以我更新了 let posts = json["posts"] as? [[字符串:任何]] ?? []。试试新代码,它应该适合你。
    • 谢谢,现在它适用于posts!我怎样才能获得textresult 的值?我尝试了let text = json["text"] as? [String: String] print(text),但结果显示nil
    • 试试让 json["text"] as?字符串
    • 警告:Cast from '[String : Any]' to unrelated type '[[String : Any]]' always fails
    【解决方案2】:

    距离--困难的 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()
    
    
    
        }
    

    【讨论】:

      【解决方案3】:

      在 Swift 3.0 中用于 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()
      

      在 swift 3.0 中用于 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()
      

      【讨论】:

      • 如何使用 get 方法获取单个值...比如获取 id 2 值?
      【解决方案4】:

      因为你的测试json数据结构应该是“[String: AnyObject]”。 json键“posts”值是数组类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-14
        • 2021-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多