Handle Multiple DataType in the Same JSON Response Key
If you are facing an issue with multiple datatype values getting in the same JSON response key then you can try this one.
enum AnyDataTypeValue:Codable{
case int(Int)
case string(String)
case bool(Bool)
case double(Double)
case float(Float)
case error
init(from decoder:Decoder) throws{
let cont = try decoder.singleValueContainer()
if cont.decodeNil(){
self = .error
}else if let val = try? cont.decode(Int.self){
self = .int(val)
}else if let val = try? cont.decode(String.self){
self = .string(val)
}else if let val = try? cont.decode(Bool.self){
self = .bool(val)
}else if let val = try? cont.decode(Double.self){
self = .doulble(val)
}else if let val = try? cont.decode(Float.self){
self = .float(val)
}else{
self = .error
}
}
func encode(to encoder: Encoder) throws{
var cont = encoder.singleValueContainer()
switch self{
case .int(let value):
try cont.encode(value)
case .string(let value):
try cont.encode(value)
case .bool(let value):
try cont.encode(value)
case .double(let value):
try cont.encode(value)
case .float(let value):
try cont.encode(value)
case .error:
try cont.encode(self)
break
}
}
var strValue:String{
switch self{
case .int(let value):
return “\(value)”
case .string(let value):
return value
case .double(let value):
return “\(value)”
case .float(let value):
return “\(value)”
default:
return “”}
}
var intValue:Int{
switch self{
case .int(let value):
return value
case .string(let value):
return Int(value) ?? 0
case .double(let value):
return Int(value)
case .float(let value):
return Int(value)
default:
return 0}
}
var floatValue:Float{
switch self{
case .int(let value):
return Float(value)
case .string(let value):
return Float(value) ?? 0.0
case .double(let value):
return Float(value)
case .float(let value):
return value
default:
return 0.0}
}
var doubleValue:Double{
switch self{
case .int(let value):
return Double(value)
case .string(let value):
return Double(value) ?? 0.0
case .double(let value):
return value
case .float(let value):
return Double(value)
default:
return 0.0}
}
var boolValue:Bool{
switch self{
case .int(let value):
return value == 1
case .string(let value):
return (Int(value) ?? 0) == 1
case .bool(let value):
return value
default:
return false}
}
}
Use?
Suppose you are getting the key in your response in which you are getting the multiple dataType value you can use it like as
let value = try container.decodeIfPresent(AnyDataTypeValue.self, forKey: .yourKeyName)
value?.intValue ?? 0
Thank you