Одним из способов решения этой проблемы является создание структуры, представляющей json, и реализация протокола Decodable
(или Codable
, если вы хотите декодировать и кодировать объекты).
После определения структуры выпросто используйте JSONDecoder().decode
. Следующий проект детской площадки объясняет это:
import Foundation
let sampleJson = """
[
{
"name": "Jay",
"pastdata": [
{
"username": "lollipopaka",
"formerpassword": [
"abc123",
"def213",
"j3rds1",
"ads2fsa"
]
},
{
"username": "deekmcnator",
"formerpassword": [
"qk2j30d"
]
},
{
"username": "wewunwun123",
"formerpassword": [
"dsqwv241s",
"d323df1ds",
"sk2d2jo"
]
}
]
},
{
"name": "Aaron"
},
{
"name": "Abraham",
"pastdata": null
},
{
"name": "Lucy",
"pastdata": [
{
"username": "lucy01",
"formerpassword": [
"pass01",
"pass02"
]
},
{
"username": "lucy02",
"formerpassword": [
"pass03",
"pass04"
]
}
]
},
{
"name": "Moses",
"pastdata": [
{
"username": "moses01",
"formerpassword": [
]
}
]
}
]
"""
struct PastData: Codable, CustomStringConvertible {
let username: String? // Doesn't make sense a null username but
// set as optional since ChrisZ asked for
let formerpassword: [String]? // Optional to handle no former passwords
var description: String {
(username ?? "\t\tUsername is null") +
(formerpassword?.count == 0 ? "\t\tFormerpassword is empty" : formerpassword?.description ?? "\t\tFormerpassword is null")
}
}
struct UserData : Codable, CustomStringConvertible {
let name: String
let pastdata: [PastData]? // Is optional to take care of no pastdata
var description: String {
"\(name)\n" + (pastdata?.count == 0 ? "\tPastdata is empty" : pastdata?.description ?? "\tPastdata is null")
}
}
func myParse(jsonData: Data) -> [UserData] {
// If data can't be parse return empty array
guard let dataDecoded = try? JSONDecoder().decode([UserData]?.self, from: jsonData) else {
return []
}
return dataDecoded
}
if let jsonAsData = sampleJson.data(using: .utf8) {
let returnedData = myParse(jsonData: jsonAsData)
returnedData.forEach { // Display each element in UserData array
print($0)
}
}