JSON, который вы пытаетесь проанализировать, не имеет очень логичной структуры. Если у вас есть контроль над JSON, вы должны сначала поработать над этим. Если у вас нет контроля, я предлагаю преобразовать json на стороне клиента перед анализом.
Следующие работы на детской площадке:
let str = """
{ "mass_info1": [{ "mass_id":7780, "mass_date":"5/1/2019", "mass_time":"7:30 PM", "mass_location":"", "mass_description": "Blah1"
} ] ,
"mass_info2": [ { "mass_id":7781, "mass_date":"6/10/2019", "mass_time":"7:30 PM", "mass_location":"1234 some place Los Angeles", "mass_description": "Blah2"
} ] ,
"mass_info3":
[ { "mass_id":7783, "mass_date":"5/21/2019", "mass_time":"7:30 PM", "mass_location":"", "mass_description": "blah3"
} ] ,
"mass_info4":
[ { "mass_id":1115, "mass_date":"4/5/2019", "mass_time":"2:30 PM", "mass_location":"4050 Mission Ave, Oceanside, CA 92057", "mass_description": "blah4"
} ]
}
"""
struct MassInfoObject: Codable {
var mass_id: Int
var mass_date: String?
var mass_time: String?
var mass_location: String?
var mass_description: String?
}
let data = str.data(using: .utf8)!
let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: [[String: Any]]]
let jsonArray = json!.values.map { $0 }
let cleanedJson = try JSONSerialization.data(withJSONObject: jsonArray, options: [])
let decoder = JSONDecoder()
let items = try decoder.decode([[MassInfoObject]].self, from: cleanedJson)
Первые шаги - преобразовать json во что-то, что может быть легко проанализировано. Поскольку теперь MassInfoObject соответствует Codable
, вы можете использовать простой JSONDecoder для декодирования массива объектов, это всего лишь одна строка кода.
Кроме того, в вашем сетевом коде вы вызываете асинхронную задачу, но вы возвращаетесь немедленно, это не сработает. Когда вы возвращаетесь из функции getJson
, у вас еще нет результатов. Проще всего использовать замыкание, которое можно вызвать с результатами:
В вашем сетевом коде это будет выглядеть так:
func getjson(handler: @escaping ([MassInfoObject]?)->()) {
let urlPath = "http://myclassinfo.com/dev/json.php"
let url = URL(string: urlPath)
let task = URLSession.shared.dataTask(with: url!) { data, response, error in
print("Task completed")
guard let data = data && error == nil else {
//print(error?.localizedDescription)
return
}
do {
let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: [[String: Any]]]
let jsonArray = json!.values.map { $0 }
let cleanedJson = try JSONSerialization.data(withJSONObject: jsonArray, options: [])
let decoder = JSONDecoder()
let items = try decoder.decode([[MassInfoObject]].self, from: cleanedJson).compactMap { $0 }
handler(items)
} catch let parseError as NSError {
print("JSON Error \(parseError.localizedDescription)")
handler(nil)
}
}
task.resume()
}
Если у вас есть json, который выглядит так:
[
{
"mass_description": "Blah1",
"mass_date": "5/1/2019",
"mass_location": "",
"mass_time": "7:30 PM",
"mass_id": 7780
},
{
"mass_description": "blah2",
"mass_date": "6/10/2019",
"mass_location": "1234 some place Los Angeles",
"mass_time": "7:30 PM",
"mass_id": 7781
},
{
"mass_description": "blah3",
"mass_date": "5/21/2019",
"mass_location": "",
"mass_time": "7:30 PM",
"mass_id": 7783
},
{
"mass_description": "blah4",
"mass_date": "4/5/2019",
"mass_location": "4050 Mission Ave, Oceanside, CA 92057",
"mass_time": "2:30 PM",
"mass_id": 1115
}
]
Вы можете легко расшифровать это:
let items = try JSONDecoder().decode([MassInfoObject].self, data)