Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌套字典上的Swift Codable崩溃_Swift_Codable - Fatal编程技术网

嵌套字典上的Swift Codable崩溃

嵌套字典上的Swift Codable崩溃,swift,codable,Swift,Codable,我有一个复杂的JSON对象,看起来像这样(它被截断,只是为了给出嵌套的概念: { "absolute_magnitude_h" = "23.4"; ... "close_approach_data" = ( { "close_approach_date" = "1994-09-03"; "epoch_date_close_approach" = 778575600000;

我有一个复杂的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 {

   }
例如,我可以毫无问题地获取顶级键/值(绝对值),CloseApproach数据也会被填充。但如果我尝试检索轨道数据,则此NeoObj将变为零。我甚至还没有尝试检索轨道类(


我哪里出错了?

“4.058036874987604”
是一个
字符串
,如果没有自定义解码,就无法将其解码为
var apheliondance:Float

我建议您查看一下“使用中的面包”,它包含嵌套结构和处理自定义转换。您很可能需要创建自定义解码器来处理各种类型的数据转换格式化(尽管其中大多数都是样板文件)。您也可以跳过这篇文章并查看。我认为您的结构应该包含数据中的所有JSON键。您可能也遇到了问题,因为浮点是“单精度浮点值类型”,而双精度是“双精度浮点值类型”。虽然我没有仔细检查所提供的数据是否会在您的设备上造成问题,但切换到64位双精度类型可能更简单。

这就是为什么您应该放置打印(错误)在catch块内,尝试它并附加与@Sh_Khan一致的错误。我还建议您使用可选值。没有错误,当我尝试获取轨道数据时,它只是一个nil对象,如果我评论它有效的话。@PruitIgoe您可以尝试将
neoorbiotaldata.aphelionDistance
更改为double请学习阅读JSON。它非常简单。例如,双引号中的所有内容都是
字符串
,甚至是
“1.2”
“false”
。没有例外。