ios swift json数据到字典
我有一个php脚本中的以下数据格式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
{“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)
}
}