首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套字典上的Swift Codable

嵌套字典上的Swift Codable
EN

Stack Overflow用户
提问于 2018-10-18 05:26:33
回答 2查看 201关注 0票数 2

我有一个复杂的JSON对象,它看起来像这样(它被截断,只是为了给出嵌套的概念:

代码语言:javascript
复制
{
    "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;
        }
    }

}

我的可编码对象如下所示:

代码语言:javascript
复制
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"
    }

}

我的代码是:

代码语言:javascript
复制
do {

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

   }

例如,我可以毫无问题地获得顶级键/值(absolute_magnitude_h),并且closeApproachData也会被填充。但是如果我尝试检索orbital_data,那么thisNEOObj就变成了nil。我甚至还没有尝试检索orbit_class。:(

我哪里错了?

EN

回答 2

Stack Overflow用户

发布于 2018-10-18 17:18:31

"4.058036874987604"是一个String,没有自定义解码就不能解码成var aphelionDistance: Float

票数 0
EN

Stack Overflow用户

发布于 2019-01-13 15:50:51

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52863857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档