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进行额外的编码/解码,以生成这些库期望的数据类型。 对JSONEcoderJSONDecoder的扩展很自然地放置了此逻辑,因为您仍然可以访问诸如dateEncodingStrategy类的dateEncodingStrategy 。 结果看起来像这样:

尽管这种方法肯定不会获得任何效率方面的奖励,但它为我们现在需要与之交互的API和光荣的Codable未来之间架起了一座简单的桥梁。