декодировать строку Json в объект класса Swift - PullRequest
0 голосов
/ 19 ноября 2018
 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)'

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Попытка декодирования любого типа объекта в строку в 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) 
}
0 голосов
/ 19 ноября 2018

Если вы пытаетесь декодировать любой тип объекта, используйте эту технику

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")
...