ios - 如何在 API 的未指定返回数据中使用可解码
问题描述
当试图解析来自 API 的返回数据时,我得到“无法读取数据,因为它的格式不正确。” 因为回报不一致。
当 logo_url 具有值时,它是一个对象,请参见下面的示例:
"logo_url": {
"mime_type": "image/jpeg",
"url": "http://google.com"
},
但是当它没有值时,它返回空数组
"logo_url": [],
这就是为什么我得到“无法读取数据,因为它的格式不正确”的原因。
我的模型
struct Model: Decodable {
let logo: Logo?
enum CodingKeys: String, CodingKey {
case logo = "logo_url"
}
}
struct Logo: Decodable {
let mimeType: String?
let url: String?
enum CodingKeys: String, CodingKey {
case mimeType = "mime_type"
case url
}
}
解决方案
如果你不能改变这个写得很糟糕的 API,你需要一个自定义解码器,你基本上尝试解码为你想要的类型,并且失败了 - 让它nil
:
struct Model: Decodable {
let logo: Logo?
enum CodingKeys: String, CodingKey {
case logo = "logo_url"
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
if let logo = try? container.decode(Logo.self, forKey: .logo) {
self.logo = logo
} else {
self.logo = nil
}
}
}
推荐阅读
- python - Django form.is_valid 给出 False
- mysql - 使用大表 DESC 限制 1 加速查询
- php - 无法在生产环境中启动 Laravel 5.4 应用程序(PHP 5.6)
- apache - 来自互联网的树莓派网络服务器
- ios - 自定义按钮点击在表格页脚视图中的 UIView 中不起作用
- .net - 如何从 PowerShell 函数中获取 .NET StandardOutput 和 StandardError
- blockchain - 为什么区块链概念如此炒作,尽管基线安全交易是相同的
- tesseract - 在 ionic 3 项目中使用 tesseract 插件从图像中获取文本
- python - 如何使用 python pandas 从 excel 路径列表中创建一个包含特定 excel 信息的大型数据框
- php - 无法将我的表单数据传递给我的 php 函数