在Swift中将字典转换为JSON


Swift提供了一个名为JSONSerialization的类,用于将字典转换为JSON字符串。我们将使用两个步骤在Swift语言中将字典转换为JSON字符串。步骤如下:

  • 使用JSONSerialization.data()方法将字典转换为JSON数据格式,该方法将字典对象作为参数以及选项。

  • 现在,使用String(data:encoding:)构造函数将JSON数据转换为JSON字符串格式。

在本文中,您将看到一些将字典转换为JSON字符串的示例。

JSONSerialization

iOS和macOS的Foundation框架默认包含JSONSerialization类。要创建Swift字典或数组,此类需要字符串或数据对象。使用相同的类,您还可以将字典或数组转换为JSON对象。JSONSerialization类处理序列化和反序列化过程。

以下是将字典转换为JSON字符串的示例

  • 步骤1 - 创建一个全局函数,该函数将字典作为参数进行转换。

  • 步骤2 - 使用data(withJSONObject:options:)方法将字典转换为JSON数据格式。

  • 步骤3 - 在此方法中处理失败的情况,因为data()方法返回一个可选的数据值。

  • 步骤4 - 使用String(data:encoding)方法将JSON数据转换为JSON字符串。

  • 步骤5 - 处理失败的情况,因为此方法返回一个可选的字符串值。

import Foundation
func convertDictionaryToJSON(_ dictionary: [String: Any]) -> String? {

   guard let jsonData = try? JSONSerialization.data(withJSONObject: dictionary, options: .prettyPrinted) else {
      print("Something is wrong while converting dictionary to JSON data.")
      return nil
   }

   guard let jsonString = String(data: jsonData, encoding: .utf8) else {
      print("Something is wrong while converting JSON data to JSON string.")
      return nil
   }

   return jsonString
}
let dictionary: [String: Any] = ["name": "John Allen", "age": 32, "company": "Google Inc."]
if let output = convertDictionaryToJSON(dictionary) {
   print("Input dictionary: \(dictionary)")
   print("Output JSON: \(output)")
}

输出

Input dictionary: ["age": 32, "name": "John Allen", "company": "Google Inc."]
Output JSON: {
   "age" : 32,
   "name" : "John Allen",
   "company" : "Google Inc."
}

请注意,如果字典包含无法转换为JSON的值,例如自定义对象或循环引用,则data(withJSONObject:options:)方法将抛出错误,并且do-try-catch块内的代码将不会执行。

使用扩展

还有另一种强烈推荐的方法可以将字典转换为JSON字符串。您可以创建一个扩展,并将这些函数添加到该扩展中。这将有助于在您的代码库中全局访问这些属性和方法。以下是如何使用扩展的示例。

扩展

import Foundation
extension Dictionary {
       
   var jsonData: Data? {
      return try? JSONSerialization.data(withJSONObject: self, options: [.prettyPrinted])
   }
       
   func toJSONString() -> String? {
      if let jsonData = jsonData {
         let jsonString = String(data: jsonData, encoding: .utf8)
         return jsonString
      }
      return nil
   }
}

用法

func convertDictionaryToJSON() {
       
   let dictionary: [String: Any] = ["name": "John Allen", "age": 32, "company": "Google Inc."]
   guard let jsonData = dictionary.jsonData else {
      print("Something is wrong while converting dictionary to JSON data.")
      return
   }
   guard let jsonString = dictionary.toJSONString() else {
      print("Something is wrong while converting JSON data to JSON string.")
      return
   }
   print("Input dictionary: \(dictionary)")
   print("Output JSON: \(jsonString)")
}
convertDictionaryToJSON()

输出

Input dictionary: ["age": 32, "company": "Google Inc.", "name": "John Allen"]
Output JSON: {"age" : 32, "company" : "Google Inc.", "name" : "John Allen"}

结论

在Swift中,您可以通过低级API将原始JSON数据转换为集合,例如数组或字典。您可以使用JSONSerialization类将原始JSON对象转换为有意义的对象。此类内置于Foundation框架中。您可以在任何平台上使用此类,例如iOS、macOS、watchOS等。此外,反过来,您可以使用反序列化过程将自定义对象转换回原始JSON数据。

在Swift 4中,Apple引入了Codable协议,使序列化和反序列化过程变得容易。此协议提供了一种灵活的方式来使用JSON数据将数据解析并存储到模型类/结构体中。此协议可用于轻松地将模型对象转换为JSON数据。

Codable协议有助于减少代码并处理序列化和反序列化过程,使代码更简洁易维护。

更新于:2023年4月4日

9K+ 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.