Swift 4:桥接可编码,JSON和[String:Any]
如果您像大多数Swift开发人员一样,您会欣喜若狂,我们最终对如何在Swift中处理JSON有了明确的答案。 Codable
实际上为您免费提供了自定义数据结构的序列化/反序列化。 它开箱即用地支持JSON和Plist,并且它易于扩展的体系结构意味着在接下来的几个月中,我们将在GitHub上看到很多其他选择-我在为您提供YAML。
但是,尽管Swift需要花一些时间为我们提供标准,但社区的其他成员仍然必须与基于JSON的API进行交互。 这导致了各种各样的库和策略。 在大多数情况下, Codable
现在提供了这些其他解决方案的批发替代品。 进行切换应尽量避免麻烦,并减少代码行和依赖性。 那是双赢。
想要让我们通过处理JSON序列化/反序列化来提供更多帮助的库的情况有点令人h目结舌。 PubNub是这种方法的一个示例。 这些库希望与Any
(通常表示[String: Any]
或[Any]
)进行交互。 我敢肯定,随着时间的Codable
,这些库中的大部分将包含Codable
,但是现在应该如何与它们集成?
Codable
为我们提供了一种将自定义对象映射到Data
,因此,如果我们有一种将Data
映射到[String: Any]
或[Any]
那么我们就可以了! 幸运的是, JSONSerialization
做到这一点。 因此,一个简单的解决方案是使用JSONSerializtion
进行额外的编码/解码,以生成这些库期望的数据类型。 对JSONEcoder
和JSONDecoder
的扩展很自然地放置了此逻辑,因为您仍然可以访问诸如dateEncodingStrategy
类的dateEncodingStrategy
。 结果看起来像这样:
尽管这种方法肯定不会获得任何效率方面的奖励,但它为我们现在需要与之交互的API和光荣的Codable
未来之间架起了一座简单的桥梁。