问题
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)
}
}
Here I write above code to decode Json string to class object by passing class type .But it gives the following error
Cannot invoke 'decode' with an argument list of type '(Any.Type, from: Data)'
回答1:
If you are trying to decode any type of object then use these technique
1. Generics function
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. Extend Decodable
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
}
}
}
Use:
let user = User.map(JSONString:"your JSON string")
let users = [User].map(JSONString:"your JSON string")
回答2:
Trying to decode any type of Object to String in 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)
}
来源:https://stackoverflow.com/questions/53367491/decode-json-string-to-class-object-swift