首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Swift Decodable属性解码嵌套数组的嵌套字典?

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

Stack Overflow用户
提问于 2018-03-22 16:51:55
回答 4查看 1.3K关注 0票数 1

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

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

我尝试过但执行失败的代码是,

代码语言:javascript
复制
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
}

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

EN

回答 4

Stack Overflow用户

发布于 2018-03-22 17:37:32

有很多问题。

通过部分忽略根对象,您正在犯一个常见的错误。

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

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

代码语言:javascript
复制
struct Root : Decodable {
    let components : Class
    let location: Location
    let statusTracker: StatusTracker

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

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

代码语言:javascript
复制
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

代码语言:javascript
复制
do {
    let result = try decoder.decode(Root.self, from: data)
} catch { print(error) }
票数 3
EN

Stack Overflow用户

发布于 2018-03-22 17:19:32

看起来你用错误的方式消毒了Class对象。它应该看起来像这样:

代码语言:javascript
复制
struct Class: Decodable {
    let class: [internalComponents]
    let location: [location]
    let statusTracker: [statusTracker]
}
票数 0
EN

Stack Overflow用户

发布于 2018-03-22 17:34:41

这里有一些事情会导致你的问题。

  • 在你的类结构中,你的项被设置为数组,但它们不是数组

  • 来调试这些类型的问题,把你的解码包在一个do 块中并打印出错误。它会告诉您无法解析的原因

在我的游乐场上试试这段代码:

代码语言:javascript
复制
let jsonData = """
{
    "class": {
        "semester1": [{
            "name": "Kal"
        }, {
            "name": "Jack"
        }, {
            "name": "Igor"
        }],
        "subjects": [
            "English",
            "Maths"
        ]
    },
    "location": {
        "Dept": [
            "EnglishDept"
        ],
        "BlockNo": 1000
    },
    "statusTracker": {
        "googleFormsURL": "beacon.datazoom.io",
        "totalCount": 3000
    }
}
""".data(using: .utf8)!

struct Response: Decodable {
    let cls: Class
    let location: Location
    let statusTracker: statusTracker

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

struct Class: Decodable {
    let semester: [SemesterStudents]
    let subjects: [String]

    enum CodingKeys: String, CodingKey {
        case semester = "semester1"
        case subjects
    }
}

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

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

struct statusTracker: Decodable {
    let googleFormsURL: URL
    let totalCount: Int
}

struct SemesterStudents: Decodable {
    let name: String
}

struct Dept: Decodable {
    let Depts: String
}

do {
    let result = try JSONDecoder().decode(Response.self, from: jsonData)
    print(result)
} catch let error {
    print(error)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49424179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档