使用Swift Codable进行无痛JSON解析
最近,JSON已成为最广泛使用的格式,可以在整个Internet上传输数据。 在iOS开发领域,开发人员通常会在Swift中使用JSON数据并将其用于构建iOS应用。 有一些很酷的库,例如SwiftyJSON已经可以在Swift中使用JSON数据了,这些库之所以流行,是因为开发人员不需要使用JSONSerialization处理不可读的混乱来解析JSON。 幸运的是,Swift 4作为Foundation框架的一部分引入了令人惊叹的Codable协议,并且JSON解析成为一行或两行代码。 这是Apple完全支持的解决方案,可以轻松采用。 它提供了定制功能,可以对复杂的场景进行编码和解码。
在本文中,我们将通过构建Github Information应用程序来了解如何使用Swift 4 Codable解析JSON。
在WWDC 2017上,Apple引入了Swift中的新功能,可以使用Swift Codable协议轻松解析JSON。 有关Foundation的新增功能,可以观看谈话,您可以从23分钟开始观看此新功能。 基本上,此协议具有Encodable和Decodable协议的组合,可用于双向使用JSON数据。 总而言之,Swift Codable协议为我们提供了以下内容。
- 使用Codable,我们可以通过编写很少的代码行将JSONObject或PropertyList文件建模为等效的Struct或Classs。 我们不必为对象中的属性编写构造函数。 全部由Codable处理。 我们只需要扩展我们的模型以符合Codable,Decodable或Encodable协议即可。
- Swift的强数据类型与JSON的丢失数据类型之间的不匹配已由Swift编译器内部处理。 现在,我们可以处理Swift Data类型,例如Date,URL,Float等
- 复杂的JSON可以使用嵌套结构轻松建模,以提高可读性。
- 使用JSONDecoder解析实际JSON成为一线人
已经有许多关于该主题的文章,涵盖了Codable协议的端到端介绍。 但是在这篇简短的文章中,我们将使用GitHub API并构建一个示例应用程序来简要演示此功能。
我们将使用非常著名的GitHub API来演示此功能。 我们将构建一个简单的应用程序,该应用程序使用GitHub用户名,并在单击“显示”按钮时显示一些信息。
有一个API可显示GitHub用户的公共信息,例如,我可以使用此API端点找到GitHub帐户的详细信息
https://api.github.com/users/shashikant86
这将以JSON格式返回信息,该信息目前看起来像这样。
{ “登录”:“ Shashikant86”, “ id”:683799, “ avatar_url”:“ https://avatars0.githubusercontent.com/u/683799?v=4”, “ gravatar_id”:“”, “ url”:“ https://api.github.com/users/Shashikant86”, “ html_url”:“ https://github.com/Shashikant86”, “ followers_url”:“ https://api.github.com/users/Shashikant86/followers”, “ following_url”:“ https://api.github.com/users/Shashikant86/following{/other_user}”, “ gists_url”:“ https://api.github.com/users/Shashikant86/gists{/gist_id}”, “ starred_url”:“ https://api.github.com/users/Shashikant86/starred{/owner}{/repo}”, “ subscriptions_url”:“ https://api.github.com/users/Shashikant86/subscriptions”, “ organizations_url”:“ https://api.github.com/users/Shashikant86/orgs”, “ repos_url”:“ https://api.github.com/users/Shashikant86/repos”, “ events_url”:“ https://api.github.com/users/Shashikant86/events{/privacy}”, “ received_events_url”:“ https://api.github.com/users/Shashikant86/received_events”, “ type”:“用户”, “ site_admin”:否, “ name”:“ Shashikant”, “ company”:“ @ AOL,@ BBC,@ PhotoBox”, “ blog”:“ http://shashikantjagtap.net”, “位置”:“伦敦”, “电子邮件”:null, “可租用”:null, “ bio”:“ BDDfire和XCFit的作者。DevOps自动化iOS Swift PHP Ruby开发。CI&CD [Jenkins,Docker,AWS,Xcode Server] BDD [Cucumber Behat Cucumberish,Fitnesse]”, “ public_repos”:112, “ public_gists”:1, “关注者”:108, “以下”:52, “ created_at”:“ 2011-03-22T12:39:11Z”, “ updated_at”:“ 2017-10-05T14:32:54Z” }
这实际上是很多信息,但是对于演示,我们将仅使用以下属性。
- 名称
- avatar_url
- 位置
- 追随者
- public_repos
现在,我们有了端点。 让我们用Xcode创建单个View iOS应用程序。 我们可以使用MVC,MVVM或类似的模式,但是我们将在ViewController.Swift中完成此演示的所有操作。 我们可以像这样使用简单的Swift Struct轻松地为这些信息建模
struct MyGitHub { 让名字:字符串? 让位置:字符串? 让追随者:诠释? 让avatar_url:URL? 让public_repo:诠释? }
可能我可以继续为每个属性编写广告构造函数,依此类推。 但是,由于我已经发现了问题,因此我将在这个阶段停止我自己
- 常量avatar_url的类型为URL,但在JSON中为String。
- 另外,请注意,常量被声明为驼峰大小写,这不是Swift标准约定。
幸运的是,Codable对这两个问题都有了答案。
- 我们必须使Struct符合可编码协议,该协议将处理数据类型不匹配的问题。 Swift编译器将在后台进行处理。 我们也不需要编写构造函数。
- 为了解决驼峰问题,我们可以声明Coding Keys枚举,并告诉对Swift常量使用蛇形大小写,对于JSON使用驼峰式大小写。
生成的Struct将如下所示:
struct MyGitHub:Codable { 让名字:字符串? 让位置:字符串? 让追随者:诠释? let avatarUrl:URL? 让回购:诠释? 私有枚举CodingKeys:字符串,CodingKey { 案例名称 案例位置 案例追随者 case repos =“ public_repos” case avatarUrl =“ avatar_url” } }
现在,我们已经实现了Swift的蛇形外壳,并且通过遵循Codable协议在模型中也有了Swift类型。
现在,我们有了基于JSON的JSON端点和模型,让我们看看解析此JSON有多么容易。 首先,我们将向端点发出请求并获取JSON,并使用单行代码使用JSONDecoder解析JSON。
卫队让gitUrl = URL(string:“ https://api.github.com/users/shashikant86”)否则{返回} URLSession.shared.dataTask(with:gitUrl){(数据,响应 ,错误) 守护让数据=数据其他{返回} 做{ 让解码器= JSONDecoder() 让gitData =试试coder.decode(MyGitHub.self,来自:数据) 打印(gitData.name) }抓住let er { print(“ Err”,err) } }。恢复()
而已! 我们已经用单行或几行代码解析了JSON。 现在,我们可以使用gitData对象打印所有属性。
现在,我们已经解析了JSON,我们可以访问应用程序所需的所有属性。 让我们为应用程序构建一些UI,以要求用户输入Github用户名并按显示按钮。 我们还将放置一些标签以在UI中显示此信息。
注意:我在设计UI时很恐怖,所以我糟糕的情节提要看起来像这样
然后,我们将该UI元素链接到ViewController以显示特定信息。
该演示应用程序的源代码可在GitHub上找到
腐烂的雨燕4
只需克隆存储库并使用代码即可
$ git clone git@github.com:Shashikant86 / Decodable-Swift4.git $ cd Decodable-Swift4 $打开Decodable.xcodeproj
玩得开心,享受可编码协议。 我们的应用程序最终将看起来像这样。
使用Swift 4和Codable协议,解析具有任何复杂性的任何JSON并在iOS应用中使用它们变得非常容易。 感谢Foundation框架团队提供了嵌入Swift的强大功能。 您决定将所有模型转换为使用Codable协议,并可能淘汰已用于从iOS应用程序解析JSON的第三方框架。
像XCBlog的 XCTEQ 发布的帖子一样 ? 您可能还喜欢我们的一些服务,例如访客博客或Mobile DevOps(CI / CD)或测试自动化。 在 Github 上 搜索我们的 服务 ,开源项目, 或者在 Twitter , Facebook , Youtube 和 LinkedIn 上关注我们 。 下载我们的 XCBlog iOS应用程序以离线阅读博客。
X CTEQ 是一家专门从事基于Mobile DevOps,CI / CD,Mobile,AI / ML的测试自动化Checkout XCTEQ产品和服务的公司, 网址 为 http://www.xcteq.co.uk 或写信给我们info@xcteq.co。英国..