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

什么Codable

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

实战代码

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)
    }
}

推荐

基础文章推荐

  • 《SwiftUI是什么,听听大牛们如何说》

经典教程推荐

  • onevcat 大神的《SwiftUI 与 Combine 编程》
  • 更新近百篇SwiftUI教程《SwiftUI2020教程》
  • 帮您突破数据存储难关《SwiftUI vs CoreData数据存储解决方案》

技术源码推荐

基础

  • SwiftUI实战之JSON和Array之间互相转换(教程含源码)
  • SwiftUI实战之JSON和Dictionary字典之间互相转换(教程含源码)

推荐文章

CoreData篇

  • SwiftUI数据存储之做个笔记App 新增与查询(CoreData)
  • SwiftUI进阶之存储用户状态实现登录与登出
  • SwiftUI 数据之List显示Sqlite数据库内容(2020年教程)

TextField篇

  • 《SwiftUI 一篇文章全面掌握TextField文本框 (教程和全部源码)》
  • 《SwiftUI实战之TextField风格自定义与formatters》
  • 《SwiftUI实战之TextField如何给键盘增加个返回按钮(隐藏键盘)》
  • 《SwiftUI 当键盘出现时避免TextField被遮挡自动向上移动》
  • 《SwiftUI实战之TextField如何给键盘增加个返回按钮(隐藏键盘)》

JSON文件篇

  • SwiftUI JSON文件下载、存储、解析和展示(代码大全)

一篇文章系列

  • SwiftUI一篇文章全面掌握List(教程和源码)
  • 《SwiftUI 一篇文章全面掌握TextField文本框 (教程和全部源码)》
  • SwiftUI一篇文章全面掌握Picker,解决数据选择(教程和源码)
  • SwiftUI一篇文章全面掌握Form(教程和源码)
  • SwiftUI Color 颜色一篇文章全解决

技术交流

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

  • 请关注我的专栏icloudend, SwiftUI教程与源码
    https://www.jianshu.com/c/7b3e3b671970

你可能感兴趣的:(SwiftUI之Codable是什么(含解析JSON源码))