使用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:诠释?
 } 

可能我可以继续为每个属性编写广告构造函数,依此类推。 但是,由于我已经发现了问题,因此我将在这个阶段停止我自己

  1. 常量avatar_url的类型为URL,但在JSON中为String。
  2. 另外,请注意,常量被声明为驼峰大小写,这不是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。英国..