Не удается декодировать ответ JSON, если он содержит более x элементов

#ios #json #swift

#iOS #json #swift

Вопрос:

В основном я могу успешно декодировать JSON с этого URL. Элемент запроса -nbd — это количество запрашиваемых «дат».

https://ssp.imcce.fr/webservices/miriade/api/ephemcc.php?-step=1mamp;-tcoor=3amp;-teph=1amp;-observer=43.078148,-79.075699,180.0amp;-mime=jsonamp;-nbd=1440amp;-output=—isoamp;-ep=2021-1-17T00:00amp;-name=p:Sun

Когда я запрашиваю -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? означает «Если была выдана ошибка? Мне все равно. Это может дать мне информацию о том, почему это не удалось? Мне все равно «. Поэтому используйте a do { try... } catch { print("Error when trying to ...: (error)" } и сообщите нам, в чем ошибка. Тогда с ошибкой нам может понадобиться code of EphemCC и soem sub codable struct .

2. @Larme Спасибо, что указали мне в этом направлении. Теперь я вижу, что у меня были несовпадающие типы данных, когда я пытался поместить двойные значения в Int.

3. Чистое совпадение, какой элемент имел тип данных, который не вписывался бы в мою искаженную структуру. Не игнорируйте ошибки, извлеченный урок.