Swift:处理多级Codable数据

Codable协议使处理简单的单层数据变得容易:如果您处理的是一个类型的单个实例,或者这些实例的数组或字典,那么一切就正常了。但是,在此项目中,我们将处理稍微复杂的JSON:一个数组内部将使用不同的数据类型来组成另一个数组。

如果要处理这种多级数据,关键是为每个级别创建单独的类型。只要数据与您要求的层次结构匹配,Codable便能够处理所有内容,而无需我们做进一步的工作。

为了演示这一点,请将此按钮放入您的内容视图:

Button("Decode JSON") {
    let input = """
    {
        "name": "Taylor Swift",
        "address": {
            "street": "555, Taylor Swift Avenue",
            "city": "Nashville"
        }
    }
    """

    // more code to come
}

这会在代码中创建一个JSON字符串。如果您不太熟悉JSON,则最好查看与之匹配的Swift结构——您可以将它们直接放在按钮操作中或ContentView结构体外部,这没关系:

struct User: Codable {
    var name: String
    var address: Address
}

struct Address: Codable {
    var street: String
    var city: String
}

PS:可以使用JSONConverter一键生成对应的结构体,这是一个开源项目,我为其增加了Codable支持

希望您现在可以看到JSON包含的内容:一个用户有一个名称字符串和一个地址,而地址是一个街道字符串和一个城市字符串。

现在最好的一点是:我们可以将JSON字符串转换为Data类型(Codable可以使用该数据类型),然后将其转换为User实例:

let data = Data(input.utf8)
let decoder = JSONDecoder()
if let user = try? decoder.decode(User.self, from: data) {
    print(user.address.street)
}

如果您运行该程序并点击按钮,您应该会看到打印出的地址——为免生疑问,我应该说这不是她的真实地址!

Codable能处理的级别数量没有限制——重要的是您定义的结构体与JSON字符串匹配。

这使我们到了该项目的概述的结尾,因此请继续将ContentView.swift重置为其原始状态。

译自 Working with hierarchical Codable data

SwiftUI:使用NavigationLink将新视图压入堆栈 Hacking with iOS: SwiftUI Edition Moonshot 项目(一)

赏我一个赞吧~~~

你可能感兴趣的:(Swift:处理多级Codable数据)