使用Swift 3解析JSON响应

12

我有一个长这样的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()
}
4个回答

27

使用此方法来解析您的数据:

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

@user3051755,posts返回一个字典数组(请参见您的JSON),因此我更新了let posts = json["posts"] as? [[String: Any]] ?? []。尝试使用新代码,应该可以为您解决问题。 - Rashwan L
尝试将json["text"]转换为字符串。 - Rashwan L
警告:将“[String: Any]”转换为不相关的类型“[[String: Any]]”总是失败的。 - User
@krummens,你遇到了什么问题?你收到了什么错误信息? - Rashwan L
我有类似于OP的JSON响应,但是我得到的响应是:“无法将类型为'__NSArrayI'(0xea76d0)的值转换为类型为'Dictionary'(0xea7928)”。 - krummens
显示剩余2条评论

6

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

1
如何使用get方法获取单个值...例如获取id为2的值? - vamsi

0

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


-5

距离 - 难以使用的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()



    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接