ios - 如何使用 Swift Decodable 属性解码嵌套数组的嵌套字典?

标签 ios swift decodable

我需要在 swift4 中解析的实际 JSON 是,

{
    "class": {
        "semester1": [
            {
                "name": "Kal"
            },
            {
                "name": "Jack"
            },
            {
                "name": "Igor"
            }
        ],
        "subjects": [
            "English",
            "Maths"
        ]
    },
    "location": {
        "Dept": [
            "EnglishDept",
            ],
        "BlockNo": 1000
    },
    "statusTracker": {
        "googleFormsURL": "beacon.datazoom.io",
        "totalCount": 3000
    }
}

我试过但未能执行的代码是,

struct Class: Decodable {
    let semester: [internalComponents]
    let location: [location]
    let statusTracker: [statusTracker]
    enum CodingKeys: String, CodingKey {
        case semester = "semester1"
        case location = "location"
        case statusTracker = "statusTracker"
    }
}
struct location: Decodable {
    let Dept: [typesSubIn]
    let BlockNo: Int
}
struct statusTracker: Decodable {
    let googleFormsURL: URL
    let totalCount: Int
}


struct internalComponents: Decodable {
    let semester1: [semsIn]
    let subjects: [subjectsIn]
}
struct semsIn: Decodable {
    let nameIn: String
}
struct subjectsIn: Decodable {
    let subjects: String
}
struct Dept: Decodable {
    let Depts: String
}

我知道这是完全错误的,有人可以给出实际格式吗?我实际上对“主题”的格式感到困惑。它也不是作为一个整体编译的。

最佳答案

有很多问题。

您犯了一个常见的错误,部分忽略了根对象。

请看一下 JSON:顶层有 3 个键 classlocationstatusTracker。所有 3 个键的值都是字典,没有数组。

因为 class(小写)是保留字,所以我使用 components。顺便说一句,请遵守结构名称以大写字母开头的命名约定。

struct Root : Decodable {
    let components : Class
    let location: Location
    let statusTracker: StatusTracker

    enum CodingKeys: String, CodingKey { case components = "class", location, statusTracker }
}

还有很多问题。这里是其他结构的合并版本

struct Class: Decodable {
    let semester1: [SemsIn]
    let subjects : [String]
}

struct Location: Decodable {
    let dept : [String]
    let blockNo : Int

    enum CodingKeys: String, CodingKey { case dept = "Dept", blockNo = "BlockNo" }
}

struct SemsIn: Decodable {
    let name: String
}

struct StatusTracker: Decodable {
    let googleFormsURL: String // URL is no benefit
    let totalCount: Int
}

现在解码Root

do {
    let result = try decoder.decode(Root.self, from: data)
} catch { print(error) }

关于ios - 如何使用 Swift Decodable 属性解码嵌套数组的嵌套字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49424179/

相关文章:

ios - JSQMessagesViewController 7.3.4 + Firebase (3.7.1) observeMessages 无法访问 FIRDataSnapshot

swift - 从优步叫车请求小部件注销

swift - 如何在可解码模型中使用继承

json - 无法使用从 json 文件加载的数据初始化 json 对象

ios - 如何在 tableView 中选择单元格时触发 pickerview

json - 忽略不支持的解码器

ios - 对 UIButton 的更改在滚动之前不会更新单元格

ios - 应用重新启动后的 AWS ExpiredTokenException

iphone - iPhone iOS 中的媒体类型启动屏幕

ios - 检测 SKAction 是否完成运行,Swift