// // Codable+JSON.swift // https://gist.github.com/KoCMoHaBTa/a5fe0bd1e3e66b5010b28c33e22397d6#file-codable-json-swift // // Created by Milen Halachev on 11.06.18. // Copyright © 2018 Milen Halachev. All rights reserved. // import Foundation extension Decodable { ///Creates an instance of the receiver from a JSON data public init?(json data: Data?) { guard let data = data else { return nil } do { let result = try JSONDecoder().decode(Self.self, from: data) self = result } catch { print(error) return nil } } ///Creates an instance of the receiver from a JSON string public init?(json string: String?) { guard let data = string?.data(using: .utf8) else { return nil } self.init(json: data) } ///Creates an instance of the receiver from a JSON object or array public init?(json object: Any?) { guard let object = object, let data = try? JSONSerialization.data(withJSONObject: object, options: []) else { return nil } self.init(json: data) } } extension Encodable { ///JSON string representation of the receiver public func json() -> String? { guard let data: Data = self.json() else { return nil } return String(data: data, encoding: .utf8) } ///JSON data representation of the receiver public func json() -> Data? { do { return try JSONEncoder().encode(self) } catch { print(error) return nil } } ///JSON object or array representation of the receiver public func json() -> Any? { guard let data: Data = self.json() else { return nil } return try? JSONSerialization.jsonObject(with: data, options: []) } } extension Encodable { ///JSON string representation of the receiver public var jsonString: String? { return self.json() } ///JSON data representation of the receiver public var jsonData: Data? { return self.json() } ///JSON object or array representation of the receiver public var jsonObject: Any? { return self.json() } }