ios swift json数据到字典

ios swift json数据到字典,ios,swift,Ios,Swift,我有一个php脚本中的以下数据格式 {“Response”:“OK”,“Data”:{“ID”:“1”,“data1”:“sample1”} 我需要在swift中使用http提取数据1,下面是代码,但代码没有按预期工作,即if let data=dict?[“data”]as?[[String:Any]]{不提供任何返回 fetchDataFromDB { (dict, error) in if(dict?["Response"] as! String

我有一个php脚本中的以下数据格式

{“Response”:“OK”,“Data”:{“ID”:“1”,“data1”:“sample1”}

我需要在swift中使用http提取数据1,下面是代码,但代码没有按预期工作,即
if let data=dict?[“data”]as?[[String:Any]]{
不提供任何返回

   fetchDataFromDB { (dict, error) in
        if(dict?["Response"] as! String == "OK"){
            var dd = dict?["Data"] as? [String:Any]
            if let data = dict?["Data"] as? [[String:Any]] {
                for d in data {
                    if let data1 = d["data1"] as? String {
                       self.data1 = data1
                    }
                                       
              }
            }       
            
        }
函数fetchDataFromDB

func fetchDataFromDB(completion: @escaping ([String:Any]?, Error?) -> Void) {
        let url = URL(string: "http://test.com/get__details.php")!

        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard let data = data else { return }
            do {
                if let array = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String:Any]{
                    completion(array, nil)
                }
            } catch {
                print(error)
                completion(nil, error)
            }
        }
        task.resume()
    }
上面的(未使用的)行是正确的,它是一个字典。并处理错误

fetchDataFromDB { (dict, error) in
    if let error = error { print(error); return }
    if let dict?["Response"] as? String == "OK",        
       let data = dict?["Data"] as? [String:Any],
       let data1 = data["data1"] as? String {
           self.data1 = data1
    }
}   
由于根对象的预期类型是字典名称,因此它会相应地进行命名

if let dictionary = try JSONSerialization... 

考虑使用
Codable
解析JSON

上面的(未使用的)行是正确的,它是一个字典。并处理错误

fetchDataFromDB { (dict, error) in
    if let error = error { print(error); return }
    if let dict?["Response"] as? String == "OK",        
       let data = dict?["Data"] as? [String:Any],
       let data1 = data["data1"] as? String {
           self.data1 = data1
    }
}   
由于根对象的预期类型是字典名称,因此它会相应地进行命名

if let dictionary = try JSONSerialization... 


考虑使用
Codable
解析JSON

最佳实践是使用
Codable
,考虑到您给类提供的JSON示例应该如下所示:

import Foundation

// MARK: - ResponseDB
struct ResponseDB: Codable {
    let response: String
    let data: DataClass

    enum CodingKeys: String, CodingKey {
        case response = "Response"
        case data = "Data"
    }
}

// MARK: - DataClass
struct DataClass: Codable {
    let id, data1: String

    enum CodingKeys: String, CodingKey {
        case id = "ID"
        case data1
    }
}
要解码对类的响应,请将此代码添加到类或自定义类:

// MARK: - Helper functions for creating encoders and decoders

func newJSONDecoder() -> JSONDecoder {
    let decoder = JSONDecoder()
    if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) {
        decoder.dateDecodingStrategy = .iso8601
    }
    return decoder
}

func newJSONEncoder() -> JSONEncoder {
    let encoder = JSONEncoder()
    if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) {
        encoder.dateEncodingStrategy = .iso8601
    }
    return encoder
}

// MARK: - URLSession response handlers

extension URLSession {
    fileprivate func codableTask<T: Codable>(with url: URL, completionHandler: @escaping (T?, URLResponse?, Error?) -> Void) -> URLSessionDataTask {
        return self.dataTask(with: url) { data, response, error in
            guard let data = data, error == nil else {
                completionHandler(nil, response, error)
                return
            }
            completionHandler(try? newJSONDecoder().decode(T.self, from: data), response, nil)
        }
    }

    func responseDBTask(with url: URL, completionHandler: @escaping (ResponseDB?, URLResponse?, Error?) -> Void) -> URLSessionDataTask {
        return self.codableTask(with: url, completionHandler: completionHandler)
    }
}

最佳实践是使用
Codable
,考虑到您给类提供的json示例应该如下所示:

import Foundation

// MARK: - ResponseDB
struct ResponseDB: Codable {
    let response: String
    let data: DataClass

    enum CodingKeys: String, CodingKey {
        case response = "Response"
        case data = "Data"
    }
}

// MARK: - DataClass
struct DataClass: Codable {
    let id, data1: String

    enum CodingKeys: String, CodingKey {
        case id = "ID"
        case data1
    }
}
要解码对类的响应,请将此代码添加到类或自定义类:

// MARK: - Helper functions for creating encoders and decoders

func newJSONDecoder() -> JSONDecoder {
    let decoder = JSONDecoder()
    if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) {
        decoder.dateDecodingStrategy = .iso8601
    }
    return decoder
}

func newJSONEncoder() -> JSONEncoder {
    let encoder = JSONEncoder()
    if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) {
        encoder.dateEncodingStrategy = .iso8601
    }
    return encoder
}

// MARK: - URLSession response handlers

extension URLSession {
    fileprivate func codableTask<T: Codable>(with url: URL, completionHandler: @escaping (T?, URLResponse?, Error?) -> Void) -> URLSessionDataTask {
        return self.dataTask(with: url) { data, response, error in
            guard let data = data, error == nil else {
                completionHandler(nil, response, error)
                return
            }
            completionHandler(try? newJSONDecoder().decode(T.self, from: data), response, nil)
        }
    }

    func responseDBTask(with url: URL, completionHandler: @escaping (ResponseDB?, URLResponse?, Error?) -> Void) -> URLSessionDataTask {
        return self.codableTask(with: url, completionHandler: completionHandler)
    }
}