如何从2个URL正确解析JSON?

时间:2017-11-20 12:30:45

标签: ios json swift parsing

我需要解析来自2个不同网址的JSON

let jsonUrlStr1 = "https://123"
let jsonUrlStr2 = "https://325"

guard let url1 = URL(string: jsonUrlStr1) else { return }
guard let url2 = URL(string: jsonUrlStr2) else { return }

这里我正在为第一个网址运行会话:

    URLSession.shared.dataTask(with: url1) { (data, response, err) in

        if err != nil {
            print("Error:\(String(describing: err))")
        }

        guard let data = data else { return }

        do {

      let myData1 = try JSONDecoder().decode(SomeJsonModel1.self, from: data)

            //Some code

        } catch let jsonErr {
            print("Error:\(jsonErr)")
        }

        }.resume()//URLSession

然后,我再次使用相同的方式为第二个网址运行另一个会话:

URLSession.shared.dataTask(with: url2) { (data, response, err) in

    if err != nil {
        print("Error:\(String(describing: err))")
    }

    guard let data = data else { return }

    do {

  let myData2 = try JSONDecoder().decode(SomeJsonModel2.self, from: data)

        //Some code

    } catch let jsonErr {
        print("Error:\(jsonErr)")
    }

    }.resume()//URLSession

此代码有效,我得到了结果。 但我认为应该有更正确的方法来解析2个网址。 请告知如何正确地做到这一点。感谢。

1 个答案:

答案 0 :(得分:3)

您可以尝试使用完成功能块

func getDataFromJson(url: String, completion: @escaping (_ success: [String : Any]) -> Void) {
        let request = URLRequest(url: URL(string: url)!)
        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!)
                return

            }

            let responseJSON  = try! JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String : Any]
            completion(responseJSON)
        }
        task.resume()
    }

并调用这样的方法:

    let jsonUrlStr1 = "https://123"
    let jsonUrlStr2 = "https://325"

    getDataFromJson(url: jsonUrlStr1, completion: { response in
       print("JSON response for url1 :: ",response) // once jsonUrlStr1 get it's response call next API 

       getDataFromJson(url: jsonUrlStr2, completion: { response in
           print("JSON response for url2 :: ",response)
       })

    })