swift优秀框架SwiftUI教程与源码

SwiftUI之Codable是什么(含解析JSON源码)

2020-05-16  本文已影响0人  iCloudEnd

什么Codable

Codable是一种将JSON数据(或字典)绑定到Swift中的模型/类/对象的方法。 Codable首先在Swift 4中可用,它省去了手动绑定和保护JSON响应的工作。

实战代码

Jietu20200516-183808@2x.jpg

Codable协议使解码平面数据变得很简单:如果您解码的是一个类型的单个实例,或者这些实例的数组或字典,那么一切就正常了。下面我们将解码稍微复杂一点的JSON:

一个array中包含另外一个array,并使用不同的数据类型

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

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

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

    // more code to come
}

这将在代码中创建一个 JSON 字符串。下面制作struct

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

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

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

现在,对于最好的部分:我们可以将 JSON 字符串转换为数据类型(这是可编码的,然后将其解码为用户实例:

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

如果你运行该程序,并点击按钮,你应该看到打印出来的地址 - 虽然只是为了避免疑问,我应该说,这不是她的实际地址!

可编码的级别数量没有限制 - 重要的是您定义的结构与您的 JSON 字符串匹配。

项目完代码

import SwiftUI

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

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

struct ContentView: View {

    var body: some View {
        VStack{
            Text("SwiftUI之Codable是什么,有什么用")
                .frame(maxWidth:.infinity)
                .padding()
                .background(Color.orange)
                .padding()
            Button("解析JSON") {
                let input = """
                {
                    "name": "知识大胖",
                    "qq": "3365059189",
                    "address": {
                        "street": "北京",
                        "city": "北京"
                    }
                }
                """

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

推荐

基础文章推荐

经典教程推荐

技术源码推荐

基础

推荐文章

CoreData篇

TextField篇

JSON文件篇


一篇文章系列

技术交流

QQ:3365059189
SwiftUI技术交流QQ群:518696470

上一篇 下一篇

猜你喜欢

热点阅读