decode Json string to class object Swift

血红的双手。 提交于 2019-12-12 12:24:21

问题


 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!