本文原载于我的博客:https://www.seekingmini.top/archives/swift-json
0 写在前面
平时写小项目时请求JSON格式的数据,怎么解析向来是一个大问题,尤其碰到嵌套型的数据,更是不知道怎么写代码才好,所以写一篇教程来记录一下。刚好好久也没写博客了,赶快写一篇来刷刷存在感…
1 JSON是什么
JSON是一个以文字为主、轻量型,并且容易使用来储存以及交换资料的方式。它通常用来呈现结构性的数据,许多我每天使用的网页服务都是以JSON格式为主的API。
一句话概括,一个JSON对象
,就是一个个的<key, value>
对的集合({<key, value>}
)。
- 举例
{
"name": "SeekingMini",
"age": 21,
"hobby": ["Swimming", "Coding"],
"location": {
"country": "China",
"city": "Suzhou"
}
}
在这个例子中,最外层的{}
包含了4个key
,分别是name
、age
、hobby
、location
,它们都是String
类型;而它们对应value
的类型分别是String
、Int
、[String]
、JSON对象
。我们发现,key
的类型一定是String
即字符串,而value
的类型是任意的。
正是因为value
的类型可以是任何类型,如果value
是JSON对象
,这意味着出现了嵌套,如location
对应的value
就是一个嵌套在JSON对象
里的JSON对象
,这为我们解析JSON数据增加了复杂度。上面的例子可以用下面的结构图表示:
|-- TOP
|-- "name" -> "SeekingMini"
|-- "age" -> 21
|-- "hobby" -> ["Swimming", "Coding"]
|-- "location"
|-- "country" -> "China"
|-- "city" -> "Suzhou"
把它旋转90度来看,其实就是一个N叉树。根结点忽略不计,其他的非叶子结点都是key
,而叶子结点都是value
。当然了,如果没有嵌套,那么这棵树只有3层,顶层是TOP
,表示最外层的大括号;第2层是key
;第3层是value
。
但是出现了嵌套,location
的子树就是它的value
,而这棵子树自身是一个JSON
对象,它的叶子结点就是非JSON
对象类型的value
。
还是不清楚什么是JSON的话,就参考菜鸟教程吧!我们的重头戏放在如何解析包含嵌套的JSON数据。
2 解析JSON数据
解析一个JSON格式的数据,最重要的是什么?我认为应该是结构层次。我们只有定义了准确的结构层次,才能在每一层解析出正确的数据。
1) 无脑struct
叠加
还是以上面的数据为例,我们可以定义出这样的结构体:
struct Person: Codable {
var name: String
var age: Int
var hobby: [String]
var location: Location
}
extension Person {
struct Location: Codable {
var country: String
va