Handle Multiple DataType in the Same JSON Response Key

Lucky Mehndiratta
2 min readJan 16, 2024

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

--

--