使用Decodable进行JSON解析
JSON是通过网络发送的最常用的数据格式。 在Swift 4之前,使用JSON是iOS的头疼事。 Apple提供了JSONSerialization类来处理JSON响应,但是JSONSerialization的问题在于,它只是将字符串响应转换为合适的NSArray或NSDictionary对象。 将字典转换为对象快速类别或目标C类是我们的责任。 所有这些手动工作都由一些非常流行的第三方库(如SwiftyJSON , JSONShootout等)解决。SwiftyJSON是我的最爱之一。 所有这些库在内部都使用反射,将JSONSerialization的输出转换为对象。
Swift 4通过Codable使一切变得简单,并终止了这些第三方库的使用。 可编码使我们能够解码和编码对象。 它可以与类,结构以及枚举一起使用。
在本教程中,我们将专注于解码响应并将其转换为快速对象。 以下是我们将在本教程中使用的一些关键术语。
关键术语
- 可腐烂
协议是可解码的。 如果要从JSON解码对象,则您的类或结构需要符合此协议。
2.可 编码
该协议是可编码的。 如果要将对象编码为Data,则您的类或结构需要符合此协议。
3.可 编码
可编码是可编码和可解码的组合协议。 如果您需要在应用程序中对对象进行解码和编码。 与其同时符合可编码性和可解码性,不如使其符合可编码性。
4. JSONDecoder
用于从JSON数据解码对象。
注意。 您的类或结构必须符合Decodable协议。
5. JSONEncoder
用于将对象编码为数据。
注意。 您的类或结构必须符合Encodable协议。
可编码有一些限制。 它仅限于某些基本数据类型,而有些则是高级数据类型。 这是我们在声明支持可编码的类时可以使用的所有数据类型的列表。
让我们从例子开始。
- 解析简单对象
班级人员:可腐烂{
变量名称:字符串
变量年龄:整数
}
让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