Сначала создайте модель данных из json:
struct MyData: Codable {
let testName: TestName
enum CodingKeys: String, CodingKey {
case testName = "Test Name"
}
}
struct TestName: Codable {
let schede: [String: String]
let info: String
enum CodingKeys: String, CodingKey {
case schede
case info = "Info"
}
}
Если вы не уверены, что ваш JSON всегда будет иметь определенное значение, вы можете сделать свойство необязательным.
затемсоздайте функцию, которая будет извлекать данные и анализировать их:
func getData(url: URL, completion: @escaping (_ data: MyData?, _ error: Error?) -> ()) {
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let receivedData = data else {
completion(nil, error)
return
}
do {
// Check if there is a valid json object and parse it with JSONDecoder
let object = try JSONDecoder().decode(MyData.self, from: receivedData)
completion(object, nil)
} catch {
completion(nil, error)
}
}
task.resume()
}
и вызывать вашу функцию:
getData(url: URL(string: "https://yourexampleurl.com/myData")!) { (data, error) in
// if you want to use the received data in the UI
// you need to dispatch it back to the main thread
// because dataTask executes it not on the main thread (by default)
DispatchQueue.main.async {
if let info1 = data?.testName.schede["info_01"] {
print("received mt info: \(info1)")
} else {
let errorMessage = error?.localizedDescription ?? "unknown error"
print("error occured: \(errorMessage)")
}
}
}
Поскольку вы сопоставили структуру json с объектами Swift, вы можете получить доступ к своим данным с помощью точкиоператор:
let info1 = data.testName.schede["info_01"]
Вы можете пройти весь путь и создать модель для объекта Schede
, а затем вместо синтаксического анализа его в качестве словаря вы можете получить доступ к значениям, например, таким:
let info1 = data.testName.schede.info1