【问题标题】:Fields in custom data model are "nil" after decoding API response with JSONDecoder().decode in Swift 5在 Swift 5 中使用 JSONDecoder().decode 解码 API 响应后,自定义数据模型中的字段为“nil”
【发布时间】:2020-04-16 04:34:39
【问题描述】:

我在 Swift 中为用户对象定义了一个自定义数据模型,如下所示: user data model

我有一个函数可以从 API 中提取用户数据,如下所示: get data from api

以下是使用 Postman 调用同一端点时的响应: api response

这是我函数第 75 行的控制台调试输出,表明我实际上正在接收该数据:debug output

据我所知,一切看起来都不错。 然后我使用 JSONDecoder().decode 来解码我从 api 收到的 jsonData,我没有收到任何错误。但是,当我从返回的用户对象中打印一个字段时,该字段(以及所有其他字段)为“nil”:all fields in user object are nil

我确定这是一件小而愚蠢的事情,但我已经花了好几个小时才弄清楚它是什么。谁能发现错误并让我知道我在这里做错了什么?

帮助非常感谢!!!

【问题讨论】:

  • 请将链接中的内容直接添加到您的帖子中。该帖子需要将来可供其他人使用,并且链接往往会失效。
  • 欢迎来到 Stackoverflow。请不要发图片,发文字。而且您忘记解码包含 statuscode 之类的键的 JSON 的根对象。

标签: swift jsondecoder


【解决方案1】:

对于 Codable,您需要为 json 键提供相同的属性名称。并确保它在正确的范围内。例如,您通过电子邮件发送 detailresponse json 对象内的属性和主 json 对象内的 detailresponse。如果你不想要更多的类,你需要使用它的 init 容器方法。

class Response: Codable {
    var statuscode: Int?
    var response_type: Int?
    // Other properties
    var detailresponse: DetailResponse?
}

class DetailResponse: Codable {
    var id: Int?
    // Other properties
    var socialmediadata: User?
}

class User: Codable {
    var id: Int?
    var email: String?
    // Other properties
}

现在,json 会像这样解析。

let response = try JSONDecoder().decode(Response.self, from: jsonData)
print(response.detailresponse?.socialmediadata?.email ?? "")

【讨论】:

  • 我还有 2 个问题,如果您可以的话,我希望能够利用您的知识和专长:1) 有没有办法摆脱外部响应结构?在我的用户对象中并不需要它。事实上,我相信当我稍后从该用户对象编码并将数据发送回 api 时,这是行不通的,因为它期待一个用户对象,没有周围的响应结构 2)还有更多的嵌套对象在 api 响应中。我可以将相应的类放到单独的文件中吗?还是解码器会遇到这种情况?
  • @BernhardEngl 是的,您可以为每个类创建单独的文件。如果您需要将 User 对象发送到后端 api,那么您只需要对 User 对象进行编码。您也可以查看this,它对理解 Codable 很有帮助。
  • 感谢您的意见!!我对这个整体结构的主要问题是,我不确定如何保持 Response.detailresponse 中携带的对象通用 - 即 detailresponse 现在硬连线到用户结构,但将为其他响应携带其他数据结构。有没有优雅的方法来解决这个问题?类响应:可解码{ var statuscode:Int? // 其他属性 var detailresponse: User? } 类用户:可编码 { var id:字符串? // 其他属性 } 类 SocialMediaData: Codable { var id: Int? // 其他属性 }
  • 刚刚意识到评论这个有点混乱。为其他人创建了一个新问题以使其受益:stackoverflow.com/questions/59518330/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 2021-05-02
  • 2018-03-27
  • 2020-12-07
  • 2019-11-05
相关资源
最近更新 更多