将 Json 字符串解码为 class 对象 Swift
decode Json string to class object Swift
private func createWeatherObjectWith(json: Data, x:Any.Type ,completion: @escaping (_ data: Any?, _ error: Error?) -> Void) {
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let weather = try decoder.decode(x.self, from: json)
return completion(weather, nil)
} catch let error {
print("Error creating current weather from JSON because: \(error.localizedDescription)")
return completion(nil, error)
}
}
我在这里写了上面的代码,通过传递 class 类型将 Json 字符串解码为 class 对象。但是它给出了以下错误
Cannot invoke 'decode' with an argument list of type '(Any.Type, from: Data)'
如果您要解码任何类型的对象,请使用这些技术
1.泛型函数
private func createWeatherObjectWith<T: Decodable>(json: Data, Object:T.Type ,completion: @escaping (_ data: T?, _ error: Error?) -> Void) {
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let weather = try decoder.decode(T.self, from: json)
return completion(weather, nil)
} catch let error {
return completion(nil, error)
}
}
2。扩展可解码
extension Decodable {
static func map(JSONString:String) -> Self? {
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
return try decoder.decode(Self.self, from: Data(JSONString.utf8))
} catch let error {
print(error)
return nil
}
}
}
使用:
let user = User.map(JSONString:"your JSON string")
let users = [User].map(JSONString:"your JSON string")
在 Swift 4.1
中尝试将任何类型的对象解码为字符串
func convertAnyObjectToJSONString(from object:Any) -> String? {
guard let data = try? JSONSerialization.data(withJSONObject: object, options: []) else {
return nil
}
return String(data: data, encoding: String.Encoding.utf8)
}
private func createWeatherObjectWith(json: Data, x:Any.Type ,completion: @escaping (_ data: Any?, _ error: Error?) -> Void) {
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let weather = try decoder.decode(x.self, from: json)
return completion(weather, nil)
} catch let error {
print("Error creating current weather from JSON because: \(error.localizedDescription)")
return completion(nil, error)
}
}
我在这里写了上面的代码,通过传递 class 类型将 Json 字符串解码为 class 对象。但是它给出了以下错误
Cannot invoke 'decode' with an argument list of type '(Any.Type, from: Data)'
如果您要解码任何类型的对象,请使用这些技术
1.泛型函数
private func createWeatherObjectWith<T: Decodable>(json: Data, Object:T.Type ,completion: @escaping (_ data: T?, _ error: Error?) -> Void) {
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let weather = try decoder.decode(T.self, from: json)
return completion(weather, nil)
} catch let error {
return completion(nil, error)
}
}
2。扩展可解码
extension Decodable {
static func map(JSONString:String) -> Self? {
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
return try decoder.decode(Self.self, from: Data(JSONString.utf8))
} catch let error {
print(error)
return nil
}
}
}
使用:
let user = User.map(JSONString:"your JSON string")
let users = [User].map(JSONString:"your JSON string")
在 Swift 4.1
中尝试将任何类型的对象解码为字符串func convertAnyObjectToJSONString(from object:Any) -> String? {
guard let data = try? JSONSerialization.data(withJSONObject: object, options: []) else {
return nil
}
return String(data: data, encoding: String.Encoding.utf8)
}