如何处理常见的JSON嵌套结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何处理常见的JSON嵌套结构相关的知识,希望对你有一定的参考价值。

参考技术A 我们继续之前的话题。很多时候,服务器返回的JSON都不是一个“扁平”的结构,而是包含了各种嵌套,在这一节,我们就来处理如何把各种嵌套的情况,对应到Swift model。

第一种情况,是用对象封装数组,例如,服务器返回了多个视频信息的JSON:

为了把类似这种情况的JSON直接转型成model,我们只要定义下面这样的 struct 就好了:

这里,由于 EpisodeList 和 Episode 都是遵从 Codable 的,因此我们可以直接用之前的方式对JSON解码:

只是这次,对应的Model类型,变成了 EpisodeList 。执行一下,就能在控制台看到下面这样的结果:

第二种情况,服务器还可能直接返回一个数组,而不使用对象封装它:

对这种情况,我们无须声明任何新的类型,只要在解码的时候,指定一个数组类型就好了:

这次,我们就会看到这样的结果:

第三种情况,可以看成是前面两种情况的组合,假设数组中的对象,是通过一个Key索引的:

对于这种情况,数组内的结构,可以用 Dictionary<String: Episode> 表示,而整个JSON,则是这种 Dictionary 的数组,于是,在解码的时候,我们只要把这个类型传递给它就好了:

执行下,就会看到这样的结果:

在这一节最后,我们结合之前说过的这些情况,看一个更一般的例子,假设我们要给视频播放的页面传递一个包含所有要显示内容的JSON,它看上去是这样的:

为了把这段JSON自动转型成Swift model,我们新建一个 struct :

它对应JSON头部视频信息的部分,这里,由于视频难度属于视频信息的一部分,我们把 EpisodeLevel 定义成了一个内嵌类型。

接下来,JSON的后半段,是系列中每一个视频的具体信息,这种情况我们已经处理过了,这里,我们把之前定义的类型整理一下:

可以看到,我们把 EpisodeType 也变成了 Episode 的内嵌类型。最后,我们定义一个表示页面数据的 struct :

这样, EpisodePage 就完全对应我们上面提到的JSON结构了,接下来,使用用 decode 方法解码就好:

执行一下,就能看到下面这样的结果了:

以上是关于如何处理常见的JSON嵌套结构的主要内容,如果未能解决你的问题,请参考以下文章

Play 2.2 JSON Reads with combinators:如何处理嵌套的可选对象?

D3 - 如何处理 JSON 数据结构?

AWS Glue:如何处理具有不同架构的嵌套 JSON

Jackson - 如何处理(反序列化)嵌套的 JSON?

如何处理android中reddit api的深层嵌套json响应?

JSON Codable - 如何处理 [Any]?