Here is another approach for Swift 4 - Using Codable
This was the JSON I received:
{ "error_code": 0, "result": { "responseData": "{\"emeter\":{\"get_realtime\":{\"voltage_mv\":237846,\"current_ma\":81,\"power_mw\":7428,\"total_wh\":1920,\"err_code\":0}}}" } }
The backslash JSON part is equal to this:
{ "emeter": { "get_realtime": { "voltage_mv": 237846, "current_ma": 81, "power_mw": 7428, "total_wh":19201, "err_code":0 } } }
And that was the code I used:
import Foundation class RealtimeEnergy: Codable { let errorCode: Int let result: ResultRealtimeEnergy? let msg: String? enum CodingKeys: String, CodingKey { case errorCode = "error_code" case result, msg } init(errorCode: Int, result: ResultRealtimeEnergy?, msg: String?) { self.errorCode = errorCode self.result = result self.msg = msg } } class ResultRealtimeEnergy: Codable { let responseData: String var emeter: Emeter enum CodingKeys: String, CodingKey { case responseData } required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) responseData = try container.decode(String.self, forKey: .responseData) let dataString = try container.decode(String.self, forKey: .responseData) emeter = try JSONDecoder().decode(Emeter.self, from: Data(dataString.utf8)) } } class Emeter: Codable { let emeter: EmeterClass init(emeter: EmeterClass) { self.emeter = emeter } } class EmeterClass: Codable { let getRealtime: GetRealtime enum CodingKeys: String, CodingKey { case getRealtime = "get_realtime" } init(getRealtime: GetRealtime) { self.getRealtime = getRealtime } } class GetRealtime: Codable { let voltageMv, currentMa, powerMw, totalWh: Int let errCode: Int enum CodingKeys: String, CodingKey { case voltageMv = "voltage_mv" case currentMa = "current_ma" case powerMw = "power_mw" case totalWh = "total_wh" case errCode = "err_code" } init(voltageMv: Int, currentMa: Int, powerMw: Int, totalWh: Int, errCode: Int) { self.voltageMv = voltageMv self.currentMa = currentMa self.powerMw = powerMw self.totalWh = totalWh self.errCode = errCode } }
And this is a trick:
emeter = try JSONDecoder().decode(Emeter.self, from: Data(dataString.utf8))
Tiago mendes
source share