如何在 Swift 中将 JSON 字符串转换为字典?
Swift 提供了一个名为 JSONSerialization 的类,用于将 JSON 字符串转换为字典格式。例如,您从数据库接收一个 JSON 字符串,为了在应用程序中使用它,您可能需要将其转换为真正的对象类型。在本文中,您将看到一些关于如何将 JSON 字符串转换为字典的示例。
什么是 JSON 字符串?
JSON 字符串是一个被转换为其他格式(如 base64 或 URL 编码)的字符串。此转换后的字符串可用于网络请求或存储在数据库中。此转换后的字符串在发送请求时提供安全性。此外,您还可以以 JSON 字符串格式发送图像数据。
JSONSerialization
iOS 和 macOS 的 Foundation 框架默认包含 JSONSerialization 类。要创建 Swift 字典或数组,此类需要一个字符串或数据对象。使用相同的类,您还可以将字典或数组转换为 JSON 对象。JSONSerialization 类处理序列化和反序列化过程。
示例
在 Swift 中,您可以使用 JSONSerialization 类将 JSON 字符串转换为字典。这是一个示例代码片段:
let jsonString = "{"movies":[{"id": 100, "name": "Transformers", "desc": "Desc here."},{"id": 101, "name": "Avengers", "desc": "Desc here 2."},{"id": 102, "name": "Interstellar", "desc": "Desc here 3."}]}" let data = Data(jsonString.utf8) do { // make sure this JSON is in the format we expect if let dictionary = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] { print("Dictionary format: \(dictionary)") } } catch let error as NSError { print("Failed to load: \(error.localizedDescription)") }
输出
Dictionary format: ["movies": <__NSArrayI 0x600000f3b3f0>( { desc = "Desc here."; id = 100; name = Transformers; }, { desc = "Desc here 2."; id = 101; name = Avengers; }, { desc = "Desc here 3."; id = 102; name = Interstellar; } ) ]
在上面的示例中,我们创建了一个包含一些基本信息的 JSON 字符串,将其转换为字典格式,最后将 JSON 数据转换为字典。jsonObject(with:options:) 方法中的 options 参数是可选的。
请注意,如果 JSON 字符串包含无法转换为字典的值,例如自定义对象或循环引用,则 jsonObject(with:options:) 方法将抛出错误,并且 do-try-catch 块内的代码将不会执行。
使用扩展
还有另一种强烈推荐的方法可以将 JSON 字符串转换为字典。您可以创建一个扩展并将这些函数添加到该扩展中。这将有助于在您的代码库中全局访问这些属性和方法。
示例
以下是如何使用扩展的示例。
extension String { var toDictionary: [String: Any]? { let data = Data(self.utf8) do { // make sure this JSON is in the format we expect if let dictionary = try JSONSerialization.jsonObject(with: data, options: .fragmentsAllowed) as? [String: Any] { return dictionary } } catch let error as NSError { print("Failed to load: \(error.localizedDescription)") } return nil } } let jsonString = "{"movies":[{"id": 100, "name": "Transformers", "desc": "Desc here."},{"id": 101, "name": "Avengers", "desc": "Desc here 2."},{"id": 102, "name": "Interstellar", "desc": "Desc here 3."}]}" if let dictionary = jsonString.toDictionary { print("Dictionary format: \(dictionary)") }
输出
Dictionary format: ["movies": <__NSArrayI 0x600001d63ab0>( { desc = "Desc here."; id = 100; name = Transformers; }, { desc = "Desc here 2."; id = 101; name = Avengers; }, { desc = "Desc here 3."; id = 102; name = Interstellar; } ) ]
结论
在 Swift 中,您可以通过低级 API 将原始 JSON 字符串转换为集合(如数组或字典)。您可以使用 JSONSerialization 类将原始 JSON 对象转换为有意义的对象。
此类内置于 Foundation 框架中。您可以在任何平台(如 iOS、macOS、watchOS 等)上使用此类。此外,反过来,您可以使用反序列化过程将自定义对象转换回原始 JSON 字符串。
在 Swift 4 中,Apple 引入了 Codable 协议,这使得序列化和反序列化过程变得容易。此协议提供了一种灵活的方式来使用 JSON 数据解析数据并将其存储到模型类/结构体中。此协议可用于轻松地将模型对象转换为 JSON 数据。
Codable 协议有助于减少代码并处理序列化和反序列化过程,使代码更简洁且易于维护。