I have the json in below structure
{
"message": null,
"data": {
"admin": {
"UserId": 1,
"CUSTOMER_PROFILING": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
},
"RISK_ASSESSMENT": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
},
"LINK_ANALYSIS": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
},
"BENCH_MARKING": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
},
"SUSPICIOUS_TRANSACTION_REPORTING": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
},
"THRESHOLD_TRANSACTION_REPORTING": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
}
},
"vinoth59": {
"UserId": 15,
"CUSTOMER_PROFILING": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
},
"RISK_ASSESSMENT": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
},
"LINK_ANALYSIS": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
},
"BENCH_MARKING": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
},
"SUSPICIOUS_TRANSACTION_REPORTING": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
},
"THRESHOLD_TRANSACTION_REPORTING": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
}
},
"ba_user": {
"UserId": 16,
"CUSTOMER_PROFILING": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
},
"RISK_ASSESSMENT": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
},
"LINK_ANALYSIS": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
},
"BENCH_MARKING": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
},
"SUSPICIOUS_TRANSACTION_REPORTING": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
},
"THRESHOLD_TRANSACTION_REPORTING": {
"id": 0,
"total": 0,
"high": 0,
"low": 0,
"medium": 0
}
}
},
"status": true
}
and my codable class look like below
struct UserRiskReportBase : Codable {
let message : String?
let data : [String:UserRiskReport]?
let status : Bool?
enum CodingKeys: String, CodingKey {
case message = "message"
case data = "data"
case status = "status"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
message = try values.decodeIfPresent(String.self, forKey: .message)
data = try values.decodeIfPresent([String:[String:BenchMarking]].self, forKey: .data)
status = try values.decodeIfPresent(Bool.self, forKey: .status)
}
}
struct UserRiskReport: Codable {
let userID: Int
let customerProfiling, riskAssessment, linkAnalysis, benchMarking: BenchMarking
let suspiciousTransactionReporting, thresholdTransactionReporting: BenchMarking
enum CodingKeys: String, CodingKey {
case userID = "UserId"
case customerProfiling = "CUSTOMER_PROFILING"
case riskAssessment = "RISK_ASSESSMENT"
case linkAnalysis = "LINK_ANALYSIS"
case benchMarking = "BENCH_MARKING"
case suspiciousTransactionReporting = "SUSPICIOUS_TRANSACTION_REPORTING"
case thresholdTransactionReporting = "THRESHOLD_TRANSACTION_REPORTING"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
userID = try values.decodeIfPresent(Int.self, forKey: .userID)!
customerProfiling = try values.decodeIfPresent(BenchMarking.self, forKey: .customerProfiling)!
benchMarking = try values.decodeIfPresent(BenchMarking.self, forKey: .benchMarking)!
riskAssessment = try values.decodeIfPresent(BenchMarking.self, forKey: .riskAssessment)!
suspiciousTransactionReporting = try values.decodeIfPresent(BenchMarking.self, forKey: .suspiciousTransactionReporting)!
linkAnalysis = try values.decodeIfPresent(BenchMarking.self, forKey: .linkAnalysis)!
thresholdTransactionReporting = try values.decodeIfPresent(BenchMarking.self, forKey: .thresholdTransactionReporting)!
}
}
struct BenchMarking : Codable {
let id : Int?
let total : Int?
let high : Int?
let low : Int?
let medium : Int?
enum CodingKeys: String, CodingKey {
case id = "id"
case total = "total"
case high = "high"
case low = "low"
case medium = "medium"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
id = try values.decodeIfPresent(Int.self, forKey: .id)
total = try values.decodeIfPresent(Int.self, forKey: .total)
high = try values.decodeIfPresent(Int.self, forKey: .high)
low = try values.decodeIfPresent(Int.self, forKey: .low)
medium = try values.decodeIfPresent(Int.self, forKey: .medium)
}
}
I am able get the first level keys
let dec = JSONDecoder()
dec.keyDecodingStrategy = .convertFromSnakeCase
let alertList = try dec.decode(UserRiskReportBase.self, from:response.data!)
self.userRiskReportList = alertList.data!
self.headerArr = Array(alertList.data!.keys)
print(self.headerArr)
i get the first level keys like ["admin","vinoth59","ba_user"]. I need to get the second level keys ["CUSTOMER_PROFILING","RISK_ASSESSMENT",.....]. how to achieve using this codable
dec.keyDecodingStrategy = .useDefaultKeysinstead ofdec.keyDecodingStrategy = . convertFromSnakeCaseinitmethods and used a vanilla decoderJSONDecoder().decode(UserRiskReportBase.self, from: data)and I can access the values