如何在 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 协议有助于减少代码并处理序列化和反序列化过程,使代码更简洁且易于维护。

更新于: 2023年4月4日

6K+ 浏览量

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告