swift - 将 Json 字符串解码为类对象 Swift

标签 swift decode codable

 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)
        }
    }

这里我写了上面的代码,通过传递类类型将Json字符串解码为类对象。但是它给出了以下错误

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 - 将 Json 字符串解码为类对象 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53367491/

相关文章:

ios - 按照维护顺序快速解析 json

ios - YouTube 嵌入视频无法启动

当我不解码为 utf-8 时出现 Python 意外行为

ios - 解码json时出错

json - Swift 4 JSONEncoder 中的字典键顺序

swift - 如何设置窗口的最小尺寸并使其在启动时使用指定的尺寸和位置?

ios - 如何根据其在 Swift 中的位置为加扰字母制作动画?

Java 从 Servlet 读取未解码的 URL

ios - 当 JSON 输入表示 Codable 类型的多个子类时使用 Codable

ios - 如何声明自定义对象,例如。可编码类中的计时器