[使用Swift 5进行编码和解码的JSON解析

问题描述 投票:0回答:3

我正在尝试使用Swift 5获取此数据

         <//controller class for user interface>
                class UserDetailsViewController: UIViewController {
                    override func viewDidLoad() {
                        super.viewDidLoad()
                        //call service to get user details
                        BaseBusiness.getUserDetails() { response in
                            //Response object 
                            print(response)
                        }
                    }
                }

[在Swift 5中运行正常。我更新到Swift 5,它破坏了代码。我读了几篇SO,但是我仍然很难理解它。我应用了一些建议,包括Swift 5中的JSON解析,但是我仍然无法解决出现的错误。

    > **business class where write business logic**

                class BaseBusiness {
                    static func getUserDetails(Completion:@escaping([UserModelElement])->Void){

                        let urlStringctr1 = Constant.UserUrl
                        UserDetailService.getPosts(str: urlStringctr1) { (Response) in
                            let objitemBo = Response
                            print(objitemBo)
                            Completion(objitemBo)
                        }
                    }
                }
            As of Swift 5, you need to do a cast early on.

为特定api提供的用户服务

                class UserDetailService {
                    private init(){}
                    //create static method to call request to server
                    static func getPosts(str:String, Completion:@escaping([UserModelElement])->Void){
                        //converting string to encodable url format
                       let urlStr:NSString = str.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! as NSString
                        //passing request
                        guard let url = URL(string:urlStr as String) else { return }
                        //call main service to parse data
                        NetworkingServices.shared.getData(FromUrl: url) { (RespData) in
                            do{
                                // decoding data
                                let decoder = JSONDecoder()
                                let  codabledata = try decoder.decode([UserModelElement].self, from: RespData)
                                //print information on console
                                print(codabledata)
                                //return back object by clouser
                                Completion(codabledata)
                            }catch let parsingError {
                                print("Error", parsingError)
                            }

                        }

                    }
                }

这是因为JSONSerialization现在返回Any,这没有实现[]运算符的变体。请确保您安全地解开演员表,并采取常见措施以确保不会使程序崩溃。

网络服务作为基本服务类

                lass NetworkingServices {
                    //empty initialization
                    private init(){}
                    static let shared = NetworkingServices();
                    //calling service method
                    func getData(FromUrl:URL,Completion:@escaping(Data)->Void)  {
                        //create session object
                        let session  = URLSession.shared
                        let  task = session.dataTask(with: FromUrl) { (data, response, error) in
                            //getting response
                            guard let respdata = data else {return}
                            DispatchQueue.main.async {
                            Completion(respdata)
                            }
                        }
                        task.resume()
                    }
                }

是。还要考虑对数据变量执行相同的操作,除非您100%确信它永远不会为空(如果使用网络,则永远不会100%确定)。 — — Andy Ibanez 16年9月12日在22:28正如我在问题显示中上面的代码中的注释部分,我得到了“用于条件绑定的Initializer必须具有可选类型,而不是'[String:Any]'”错误。我再次使用相同的错误得到相同的错误。难道我做错了什么? – user1828605 '16 Sep 12在22:45在您的try语句是否仍然有问号?您不需要它,但是如果您放了它,则需要做json?[“ expertPainPanels”] – Andy Ibanez 16年9月12日在22:49我意识到我要告诉你的东西与你的东西相似评论,但对我来说编译很好

json swift codable swift5 decodable
3个回答
0
投票
func getDataFromServer(FromUrl:URL,Completion:@escaping(Data)->Void)  {


    var request = URLRequest(url: FromUrl)
    request.httpMethod = "GET"

    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    request.addValue("91", forHTTPHeaderField: "UserCode")
    request.addValue("17.461365", forHTTPHeaderField: "Latitude")
    request.addValue("78.369583", forHTTPHeaderField: "Longitude")
    request.addValue("en", forHTTPHeaderField: "LanguageType")
    request.addValue("91", forHTTPHeaderField: "ISDCode")
    request.addValue(AppDelegate.phoneNo, forHTTPHeaderField: "MobileNumber")
    //request.addValue("Guest", forHTTPHeaderField: "Token")


    let configuration = URLSessionConfiguration.default
    let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)

    let task = session.dataTask(with: request, completionHandler: {(data, response, error) -> Void  in
        if (error != nil) {
            print("Error: \(error ?? "" as! Error)")
        }

        else {
            guard let jsonData = data else{return}
            if let JSONString = String(data: jsonData, encoding: String.Encoding.utf8)
            {
                print("Response: \(JSONString)")
            }
             Completion(jsonData)
        }
    })
    task.resume()
}

0
投票
static func saveDriverRequestToStore(IsAutoRequest : Bool,arrStore : [Int], Completion:@escaping(GetOTPModel)->Void){

    let urlStringctr = "http://app_dev_driver.baqalaexpress.net/DriverApi/api/baqaladriverapi/SaveDriverRequestToStore"


    let dict:[String:Any] = ["IsAutoStoreRequest": IsAutoRequest, "StoreIds": arrStore]


    NetworkingServices.shared.postRequestToServer(module: urlStringctr, parameters: dict)
    { (RespData) in

        do{

            let decoder = JSONDecoder()
            let  codabledata = try decoder.decode(GetOTPModel.self, from: RespData)
            print(codabledata)
            Completion(codabledata)

        }catch let parsingError {
            print("Error", parsingError)
        }

    }

}

0
投票
func  postRequestToServer(module:String,parameters:[String:Any],completion:@escaping (Data)-> Void){

    let jsonData = try? JSONSerialization.data(withJSONObject: parameters, options: [])

    var request = URLRequest(url: URL(string: module)!)
    request.httpMethod = "POST"

    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    request.addValue("91", forHTTPHeaderField: "UserCode")
    request.addValue("17.461365", forHTTPHeaderField: "Latitude")
    request.addValue("78.369583", forHTTPHeaderField: "Longitude")
    request.addValue("en", forHTTPHeaderField: "LanguageType")
    request.addValue("91", forHTTPHeaderField: "ISDCode")
    request.addValue(AppDelegate.phoneNo, forHTTPHeaderField: "MobileNumber")
    request.addValue("Guest", forHTTPHeaderField: "Token")

    request.httpBody = jsonData

    let configuration = URLSessionConfiguration.default
    let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)

    let task = session.dataTask(with: request, completionHandler: {(data, response, error) -> Void  in
        if (error != nil) {
            print("Error: \(error ?? "" as! Error)")
        }

        else {
            guard let jsonData = data else{return}
            if let JSONString = String(data: jsonData, encoding: String.Encoding.utf8) {
                print("Response: \(JSONString)")
            }
            completion(jsonData)
        }
    })
    task.resume()
}
© www.soinside.com 2019 - 2024. All rights reserved.