#ios #json #swift
#iOS #json #swift
Вопрос:
В основном я могу успешно декодировать JSON с этого URL. Элемент запроса -nbd
— это количество запрашиваемых «дат».
Когда я запрашиваю -nbd=769
или меньше дат, ephem
каждый раз правильно декодируется.
Однако, когда я запрашиваю -nbd=770
или более дат, мой dataTask
выводит весь ответ с 1440 элементами, но ephem
есть nil
.
Что может быть не так с этим?
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
let decoder = JSONDecoder()
if let data = data {
let str = String(data: data, encoding: .utf8)!
print(str)
let ephem = try? decoder.decode(EphemCC.self, from: data)
completion(ephem)
} else {
print("Either no data was returned, or data was not properly decoded.")
completion(nil)
}
}
task.resume()
Пример ответа JSON:
{
"sso": {
"num": "11",
"name": "Sun",
"type": "planet",
"parameters": {
"diameter": 0.1392E 7
}
},
"coosys": {
"epoch": "J2000",
"equinox": "J2000",
"system": "eq_ICRF"
},
"ephemeris": {
"time_scale": "UTC",
"planetary_theory": "INPOP19A",
"coordinates": "local",
"reference_frame": {
"type": "astrometric J2000",
"plane": "equator",
"center": "topocenter",
"topocenter": {
"iau_code": "--1",
"name": "userLocation",
"longitude": -0.79075698999999986E 2,
"latitude": 0.43078147999999999E 2,
"altitude": 0.18E 3
}
}
},
"data": [
{
"Date": "2021-01-17T00:00:00.000",
"LAST": "02:30:14.28",
"Az": 0.26002683458818331E 3,
"H": -0.20245586021541037E 2,
"Dobs": 0.98378058040177629E 0,
"VMag": -0.26775508772817108E 2,
"R": -0.999E 3,
"RV": 0.42476667062773499E 0
},
//
// ... etc, 1440 "data" elements received
//
{
"Date": "2021-01-17T23:59:00.000",
"LAST": "02:33:10.66",
"Az": 0.25997789921032143E 3,
"H": -0.19879751688585404E 2,
"Dobs": 0.98384649280603065E 0,
"VMag": -0.26775363291013889E 2,
"R": -0.999E 3,
"RV": 0.43266153050417039E 0
}
],
"datacol": {
"Date": "Date",
"LAST": "Local sidereal time",
"Az": "Azimuth",
"H": "Elevation",
"Dobs": "Range of target center to observer",
"VMag": "Apparent magnitude",
"R": "Atmospheric refraction",
"RV": "Radial velocity of target wrt observer"
},
"unit": {
"diameter": "km",
"topocenter": {
"longitude": "deg",
"latitude": "deg",
"altitude": "m"
},
"LAST": "hms",
"Az": "deg",
"H": "deg",
"Dobs": "au",
"VMag": "mag",
"R": "arcsec",
"RV": "km/s"
}
}
Комментарии:
1.
try?
означает «Если была выдана ошибка? Мне все равно. Это может дать мне информацию о том, почему это не удалось? Мне все равно «. Поэтому используйте ado { try... } catch { print("Error when trying to ...: (error)" }
и сообщите нам, в чем ошибка. Тогда с ошибкой нам может понадобиться code ofEphemCC
и soem sub codable struct .2. @Larme Спасибо, что указали мне в этом направлении. Теперь я вижу, что у меня были несовпадающие типы данных, когда я пытался поместить двойные значения в Int.
3. Чистое совпадение, какой элемент имел тип данных, который не вписывался бы в мою искаженную структуру. Не игнорируйте ошибки, извлеченный урок.