使用Decodable进行JSON解析

JSON是通过网络发送的最常用的数据格式。 在Swift 4之前,使用JSON是iOS的头疼事。 Apple提供了JSONSerialization类来处理JSON响应,但是JSONSerialization的问题在于,它只是将字符串响应转换为合适的NSArray或NSDictionary对象。 将字典转换为对象快速类别或目标C类是我们的责任。 所有这些手动工作都由一些非常流行的第三方库(如SwiftyJSONJSONShootout等)解决。SwiftyJSON是我的最爱之一。 所有这些库在内部都使用反射,将JSONSerialization的输出转换为对象。

Swift 4通过Codable使一切变得简单,并终止了这些第三方库的使用。 可编码使我们能够解码和编码对象。 它可以与类,结构以及枚举一起使用。

在本教程中,我们将专注于解码响应并将其转换为快速对象。 以下是我们将在本教程中使用的一些关键术语。

关键术语

  1. 可腐烂

协议是可解码的。 如果要从JSON解码对象,则您的类或结构需要符合此协议。

2.可 编码

该协议是可编码的。 如果要将对象编码为Data,则您的类或结构需要符合此协议。

3.可 编码

可编码是可编码和可解码的组合协议。 如果您需要在应用程序中对对象进行解码和编码。 与其同时符合可编码性和可解码性,不如使其符合可编码性。

4. JSONDecoder

用于从JSON数据解码对象。

注意。 您的类或结构必须符合Decodable协议。

5. JSONEncoder

用于将对象编码为数据。

注意。 您的类或结构必须符合Encodable协议。

可编码有一些限制。 它仅限于某些基本数据类型,而有些则是高级数据类型。 这是我们在声明支持可编码的类时可以使用的所有数据类型的列表。

让我们从例子开始。

  1. 解析简单对象
 班级人员:可腐烂{ 
 变量名称:字符串 
 变量年龄:整数 
  } 
 让jsonData =“”“ 
  { 
  “名称”:“ John Doe”, 
  “年龄”:24 
  } 
  “”“ .data(使用:.utf8)! 
 让jsonDecoder = JSONDecoder() 
 让人=尝试!  jsonDecoder.decode(Person.self,来自:jsonData) 
  print(person.name)//打印“ John Doe” 

警告:如果我们没有收到“名称”键作为响应,此代码将很容易崩溃。 为了避免崩溃,我们需要将名称指定为可选名称。

2.解析嵌套对象

嵌套的对象必须符合Codable协议。

 班级人员:可腐烂{ 
 变量名称:字符串 
 变量年龄:整数 
 堂兄弟:[人]? 
  var job:工作? 
  } 
 职业:可腐烂{ 
  var角色:字符串 
  } 

 让jsonData =“”“ 
  { 
  “ name”:“ John Doe”, 
  “年龄”:24, 
  “表兄弟”:[{ 
  “ name”:“ Joe Bloggs”, 
  “年龄”:29 
  }, 
  { 
  “ name”:“ Fred Nerk”, 
  “年龄”:27岁 
}],
  “职位”:{ 
  “ role”:“ iOS开发人员” 
  } 
}
  “”“ .data(使用:.utf8)! 
 让jsonDecoder = JSONDecoder() 
 让人=尝试!  jsonDecoder.decode([String:Person.self],来自: 
jsonData)
  print(person.job.role)//打印“ iOS开发人员” 

2.使用数组和字典

对于此示例,我们将使用与上述相同的类。

 班级人员:可腐烂{ 
 变量名称:字符串 
 变量年龄:整数 
 堂兄弟:[人]? 
  var job:工作? 
  } 
 职业:可腐烂{ 
  var角色:字符串 
  } 

数组

以下是代表人员对象数组的JSON。

 让jsonData =“”“ 
  [ 
{
  “ name”:“ John Doe”, 
  “年龄”:24, 
  “职位”:{ 
  “ role”:“ iOS开发人员” 
  } 
  }, 
  { 
  “ name”:“ Joe Bloggs”, 
  “年龄”:29 
},
  { 
  “ name”:“ Fred Nerk”, 
  “年龄”:27岁 
  } 
  ] 
  “”“ .data(使用:.utf8)! 
 让jsonDecoder = JSONDecoder() 
 让人=尝试!  jsonDecoder.decode([Person] .self,来自:jsonData) 
  print(persons.count)//打印“ 3” 

辞典

以下是JSON,它表示键“ people”下的人员对象字典。

 让jsonData =“”“ 
  { 
  “人民”:[ 
  { 
  “ name”:“ John Doe”, 
  “年龄”:24岁, 
  “工作”:{ 
  “ role”:“ iOS开发人员” 
  } 
  }, 
  { 
  “ name”:“ Joe Bloggs”, 
  “年龄”:29 
  }, 
  { 
  “ name”:“ Fred Nerk”, 
  “年龄”:27 
  } 
  ] 
  } 
  “”“ .data(使用:.utf8)! 
 让jsonDecoder = JSONDecoder() 
 让字典=试试!  jsonDecoder.decode([String:[Person]]。self,来自:jsonData) 
 如果让people = dictionary [“ people”] as?  [人员] { 
  print(people.count)//打印“ 3” 
  } 

现在,您可以使用此协议解决json解析的大部分问题。

Codable提供了一些高级功能,例如映射键名和映射对象。 我们将在下一个教程中对其进行介绍。

图片来源:https://www.wallpaperup.com

Interesting Posts