У меня есть этот универсальный c JSON Парсер, который работает с декодирующими массивами
class JSONParserFromStruct {
typealias result<T> = (Result<[T], Error>) -> Void
func downloadList<T: Decodable>(of _: T.Type,
from data: Data,
completion: @escaping result<T>) {
do {
let decodedData: [T] = try! JSONDecoder().decode([T].self, from: data)
completion(.success(decodedData))
} catch {
completion(.failure(DataError.decodingError))
}
}
}
Это пользователи. json Файл в комплекте
{
"name": "Taylor Swift"
}
Вызывается так:
func performRequest() {
let url = Bundle.main.url(forResource: "Users", withExtension: "json")!
let data = try! Data(contentsOf: url)
genericParser.downloadList(of: User.self, from: data) { result in
switch result {
case let .failure(error):
if error is DataError {
print("eroarea este: \(error.localizedDescription)")
print(url)
} else {
print("err is \(error.localizedDescription)")
}
print(error.localizedDescription)
case let .success(weather):
print(weather)
}
}
}
Работает как шарм
Однако, при попытке использовать другой файл json с именем Weather. json, он завершается ошибкой
"debugDescription:" Ожидается декодировать массив, но вместо этого найден словарь "
Это json Я получаю ошибку для
{
"main": {
"temp": 281.52,
"feels_like": 278.99,
"temp_min": 280.15,
"temp_max": 283.71,
"pressure": 1016,
"humidity": 93
}
}
Модель данных
struct Weather: Codable {
let main: Main
}
struct Main: Codable {
let temp: Double
}
... используя тот же класс JSONParserFromStruct, однако он не работает.
Так он называется
func performRequest() {
let url = Bundle.main.url(forResource: "Weather", withExtension: "json")!
let data = try! Data(contentsOf: url)
genericParser.downloadList(of: Weather.self, from: data) { result in
switch result {
case let .failure(error):
if error is DataError {
print("eroarea este: \(error.localizedDescription)")
print(url)
} else {
print("err is \(error.localizedDescription)")
}
print(error.localizedDescription)
case let .success(weather):
print(weather)
}
}
}