嵌套字典上的Swift Codable崩溃
我有一个复杂的JSON对象,看起来像这样(它被截断,只是为了给出嵌套的概念:嵌套字典上的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;
{
"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”
。没有例外。