Swift Codable Crashing On Вложенный словарь - PullRequest
0 голосов
/ 18 октября 2018

У меня есть сложный объект JSON, который выглядит примерно так (он урезан, чтобы просто дать представление о вложенности:

{
    "absolute_magnitude_h" = "23.4";
    ...
    "close_approach_data" = (
                {
            "close_approach_date" = "1994-09-03";
            "epoch_date_close_approach" = 778575600000;
            "orbiting_body" = Earth;
    })
    "orbital_data" =     {
        "aphelion_distance" = "4.058036874987604";
       "orbit_class" = { 
            "orbit_class_type" = APO;
        }
    }

}

Мой кодируемый объект выглядит так:

struct NEOObj:Codable {

    var absoluteMagnitudeH:Float
    var designation:String
    var isPotentiallyHazardousAsteroid:Bool
    var isSentryObject:Bool
    var name:String
    var nasaJPLURL:String
    var neoReferenceID:String
    var closeApproachData:[NEOCloseApproachData] = [NEOCloseApproachData]()
    var orbitalData:NEOOrbitalData?

    private enum CodingKeys: String, CodingKey {
        case absoluteMagnitudeH = "absolute_magnitude_h"
        case designation = "designation"
        case isPotentiallyHazardousAsteroid = "is_potentially_hazardous_asteroid"
        case isSentryObject = "is_sentry_object"
        case name = "name"
        case nasaJPLURL = "nasa_jpl_url"
        case neoReferenceID = "neo_reference_id"
        case closeApproachData = "close_approach_data"
        case orbitalData = "orbital_data"
    }

}

struct NEOCloseApproachData:Codable {

    var closeApproachDate:String
    var orbitingBody:String
    var epochDateCloseApproach:Int

    enum CodingKeys: String, CodingKey {
        case orbitingBody = "orbiting_body"
        case closeApproachDate = "close_approach_date"
        case epochDateCloseApproach = "epoch_date_close_approach"
    }
}

struct NEOOrbitalData: Codable {

    var aphelionDistance:Float

    enum CodingKeys: String, CodingKey {
        case aphelionDistance = "aphelion_distance"
    }

}

и мой код:

do {

    let thisNEOObj = try? JSONDecoder().decode(NEOObj.self, from: jsonData)
    print(thisNEOObj)
   } catch {

   }

Например, я могу получить ключ / значения верхнего уровня без проблем (absolute_magnitude_h), например, и closeApproachData также заполняется. Но если я пытаюсь получить orbital_data, то thisNEOObj становится нулевым. Iеще даже не пытался получить класс orbit_class.: (

Куда я иду?

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Я бы порекомендовал вам взглянуть на статью об использовании буханки, которая охватывает вложенные структуры и обработку пользовательских преобразований.Скорее всего, вам потребуется создать пользовательский декодер для обработки различных видов преобразования данных (хотя большинство из них будут стандартными).Вы также можете пропустить статью и просмотреть код на gist .Я считаю, что ваши структуры должны включать в себя все ключи JSON в данных.Вы также можете столкнуться с проблемой, потому что Float - это «Тип значения с плавающей запятой одинарной точности», а Double - «Тип значения с плавающей запятой двойной точности».Хотя я не проверил дважды, будут ли предоставленные данные вызывать проблемы на вашем устройстве, но, вероятно, проще перейти на 64-битный тип Double.

0 голосов
/ 18 октября 2018

"4.058036874987604" является String и не может быть декодировано в var aphelionDistance: Float без пользовательского декодирования.

...