ios - 如何在没有密钥的 Swift 5 可解码协议中解码字典数组类型的属性?
问题描述
下面的 JSON 响应没有字典数组的键和内容。
[
{
"content": "You can't program the monitor without overriding the mobile SCSI monitor!",
"media": [
{
"title": "Bedfordshire backing up copying",
}
],
"user": [
{
"name": "Ferne",
}
]
}
]
我正在尝试使用以下结构使用可解码协议解码此 JSON
struct Articles: Decodable {
var details: ArticleDetails
init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
details = try container.decode(ArticleDetails.self)
}
}
struct ArticleDetails: Decodable {
var content: String
var media: [Media]
var user: [User]
enum Keys: String, CodingKey {
case content
case media
case user
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: Keys.self)
content = try container.decode(String.self, forKey: .content)
media = try container.decode([Media].self, forKey: .media)
user = try container.decode([User].self, forKey: .user)
}
}
struct Media: Decodable {
var title: String
enum Keys: String, CodingKey {
case title
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: Keys.self)
title = try container.decode(String.self, forKey: .title)
}
}
struct User: Decodable {
var name: String
enum Keys: String, CodingKey {
case name
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: Keys.self)
name = try container.decode(String.self, forKey: .name)
}
}
并使用以下解码响应
let response = try JSONDecoder().decode(Articles.self, from: data)
或者
let response = try JSONDecoder().decode([ArticleDetails].self, from: data)
但得到错误
“预期解码 Dictionary<String, Any> 但找到了一个字符串/数据。”
如何解码这样的 JSON 响应,其中没有键的字典内容数组?
解决方案
模型:
struct Articles: Decodable {
let content: String
let media: [Media]
let user: [User]
}
struct Media: Decodable {
let title: String
}
struct User: Decodable {
let name: String
}
解码:
do {
let response = try JSONDecoder().decode([Articles].self, from: data)
print(response)
} catch { print(error) }
(这已经在您之前的帖子中发布过。已被删除。)
推荐阅读
- sql - MongoDB-esq SQL 查询
- asp.net - 如何在 Windows 2019 Server 上托管或运行旧版 ASP.NET 应用程序?
- python - Odoo 13 如何通过 api 运行动作?
- c# - 如何将图像或 html 代码存储在变量中?
- python - 使用 python 将 csv 文件从 GCS 存储桶上传到远程 sftp 位置
- python - 在json中保存对象
- node.js - Mongoose 添加异步虚拟字段
- python - Perlin 噪声问题:结果中的线条清晰可见
- sql - 如何使用 SQL 返回列表值
- python - `ValueError:y 中人口最少的类只有 1 个成员,这在 PyCaret 中太少了