我正在尝试用swift 4解析json,请告诉我它有什么问题?

我正在尝试用swift 4解析json,请告诉我它有什么问题?,json,parsing,struct,swift4,Json,Parsing,Struct,Swift4,我试图使用以下方法解析JSON,但XCode在声明“data”时给了我一个错误 我是新来的,我不明白怎么了。请帮帮我 import UIKit struct Contacts: Decodable { let id: Int let name: String let email: String } class ViewController: UIViewController { override func viewDidLoad() {

我试图使用以下方法解析JSON,但XCode在声明“data”时给了我一个错误

我是新来的,我不明白怎么了。请帮帮我

import UIKit

struct Contacts: Decodable {

    let id: Int
    let name: String
    let email: String

}

class ViewController: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()

        let urlString = "https://api.androidhive.info/contacts/"
        guard let url = URL(string: urlString) else {return}

        URLSession.shared.dataTask(with: url) { (data, response, error) in
        }

        guard let data = data  else {return}
        //let datastring = String(data: data, encoding: .utf8)

        do
        {
            let contact = try JSONDecoder().decode([Contacts].self, from: data)
            print(contact.name)

        } catch let jsonErr {
            print("Error deserializing json:", jsonErr)
        }
    }
}
三大问题

  • 您将忽略根对象,它是包含
    联系人
    数组的字典
  • id
    的值是
    String
    ,而不是
    Int

    一条严格的规则是:双引号中的所有内容都是
    String
    偶数
    “12”
    “false”
  • 您必须恢复该任务,并将解析JSON的代码放入完成处理程序中


  • 请试试这个,它对我有用

    func getContactListsApiCalling() {
    
         var request = URLRequest(url: URL(string: "https://api.androidhive.info/contacts/")!)
    
        request.httpMethod = "GET"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    
        let session = URLSession.shared
        let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in
    
            do {
                if let Data = data {
    
                    let responseJSON = try JSONSerialization.jsonObject(with: Data) as? Dictionary<String, AnyObject> ?? [:]
    
                    if let contacts = responseJSON["contacts"] as? [[String :AnyObject]] {
    
                        for contact in contacts {
    
    
                            let id  = contact["id"] as? String ?? ""
                            let name  = contact["name"] as? String ?? ""
                            let email   = contact["email"] as? String ?? ""
                            let address  = contact["address"] as? String ?? ""
                            let gender    = contact["gender"] as? String ?? ""
    
                            print(id,name,email,address,gender)
    
    
                        }
    
    
                    }
                }
            } catch {
    
                print("error")
            }
        })
        task.resume()
    }
    
    func getContactListsApiCalling(){
    var request=URLRequest(url:url(字符串):https://api.androidhive.info/contacts/")!)
    request.httpMethod=“GET”
    request.addValue(“应用程序/json”,forHTTPHeaderField:“内容类型”)
    让session=URLSession.shared
    让task=session.dataTask(带:request,completionHandler:{data,response,error->Void in)
    做{
    如果let Data=Data{
    让responseJSON=try JSONSerialization.jsonObject(with:Data)作为字典??[:]
    如果让contacts=responseJSON[“contacts”]作为?[[String:AnyObject]]{
    用于联系人中的联系人{
    让id=联系人[“id”]作为字符串??“
    让name=联系人[“name”]作为?字符串??“
    让email=contact[“email”]作为?字符串??“
    让地址=联系人[“地址”]作为?字符串??“
    让性别=联系人[“性别”]作为?字符串??“
    打印(id、姓名、电子邮件、地址、性别)
    }
    }
    }
    }抓住{
    打印(“错误”)
    }
    })
    task.resume()
    }
    

    }

    您到底遇到了什么错误?你能给我们看一个服务器返回的JSON的例子吗?嘿,我是在youtuber的帮助下自己弄明白的。实际上,在这段代码中,我在url函数之外应用了do。。在那之后,它只是向我显示错误,我无法获得任何数据。那太好了。你应该在答案部分写下解决方案,让其他人向@MALIKK HABIB UR REHMAN学习(并放弃投票),如果可行,请让我知道。Rahul m很抱歉,我没有尝试你的代码,因为我的代码是在遵循@Vadian的建议后才起作用的。如果你现在需要代码,你可以使用它。谢谢,我注意到了。我理解你关于int和恢复任务的观点。。但是我不明白为什么我们要用树根???嘿,谢谢!按照你的建议去做,我的代码就行了。伙计们,这是一段代码,可以帮助你,以防有人想用Post方法获取数据。在这里,我使用post方法获取了对象的Json数组。
    func getContactListsApiCalling() {
    
         var request = URLRequest(url: URL(string: "https://api.androidhive.info/contacts/")!)
    
        request.httpMethod = "GET"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    
        let session = URLSession.shared
        let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in
    
            do {
                if let Data = data {
    
                    let responseJSON = try JSONSerialization.jsonObject(with: Data) as? Dictionary<String, AnyObject> ?? [:]
    
                    if let contacts = responseJSON["contacts"] as? [[String :AnyObject]] {
    
                        for contact in contacts {
    
    
                            let id  = contact["id"] as? String ?? ""
                            let name  = contact["name"] as? String ?? ""
                            let email   = contact["email"] as? String ?? ""
                            let address  = contact["address"] as? String ?? ""
                            let gender    = contact["gender"] as? String ?? ""
    
                            print(id,name,email,address,gender)
    
    
                        }
    
    
                    }
                }
            } catch {
    
                print("error")
            }
        })
        task.resume()
    }
    
    //
    //  ViewController.swift
    //  PostMethodTest
    //
    //  Created by HABIB UR REHMAN on 12/11/2018.
    //  Copyright © 2018 HABIB UR REHMAN. All rights reserved.
    //
    
    import UIKit
    class ViewController: UIViewController {
    
      struct Resturant: Decodable {
            var name: String
            var deliveryCharges: String
            var email: String
    
            init(_ dictionary: [String: Any]) {
                self.name = dictionary["name"] as? String ?? ""
                self.deliveryCharges = dictionary["deliveryCharges"] as? String ?? ""
                self.email = dictionary["email"] as? String ?? ""
    
            }
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
    
            guard let url = URL(string: "your Link Here ") else { return }
            var request = URLRequest(url: url)
            request.httpMethod = "POST"
    
    
            let task = URLSession.shared.dataTask(with: request)  {(data, response, error) in
    
                guard let dataResponse = data,
                    error == nil else {
                        print(error?.localizedDescription ?? "Response Error")
                        return }
                do{
                    //here dataResponse received from a network request
                    let jsonResponse = try JSONSerialization.jsonObject(with:
                        dataResponse, options: [])
                    print(jsonResponse) //Response result
                } catch let parsingError {
                    print("Error", parsingError)
                }
            }
            task.resume()
    
            }
    
    
    }