如何在iPhone/iOS中解析JSON对象?


JSON代表Javascript对象表示法。大多数情况下,在处理API或其他服务时,数据以JSON格式返回,我们需要将其转换为可用且受支持的语言格式。

iOS的基础框架提供了一个JSONSerialization类,用于将JSON转换为受支持的格式,例如字典、字符串、布尔值等。

JSONSerialization类提供了一个方法jsonObject(with:options:),它解析JSON并返回Any作为结果,如果数据无法解析,则返回一个错误。

// Example JSON:
/*
{
   "age": 42.0,
   "name": {
      "firstName": “tut”
   }
}
*/

让我们通过另一个例子来看一下,假设我们从API调用中获得了数据,现在要解析这个数据,我们将使用JSONSerialization.jsonObject(with:options:)

if let data = data, let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] { }

// 现在上面的JSON对象包含接收到的数据,作为一个字符串和Any的字典,或者它会跳出if let块到else

// 假设json包含一个键“Student”,并且与之关联的值是一个字典

guard let student = json[“Student”] as? [String: Any] else { return }

这就是我们解析JSON并从中获取值的方法。我们可以使用模型和初始化器进一步增强这一点。让我们通过创建一个本地JSON文件然后尝试解析它来看一个例子。

让我们创建一个包含以下数据的JSON文件,并将其保存为exercises.json

{
   "Warmup": {
      "Exercises": [
         {
            "Name": "Neck Strech",
            "images": [
               "http:sdf.com",
               "sdf",
               "sdf",
               "sdf"
            ],
          "time": 30
         }
      ]
   }
}

我们现在将解析这个本地JSON并使用以下代码打印结果:

if let filePath = Bundle.main.path(forResource: "exerciseData", ofType: "json") {
   do {
      let data = try Data(contentsOf: URL(fileURLWithPath: filePath), options: .mappedIfSafe)
      let jsonResult = try JSONSerialization.jsonObject(with: data, options: .mutableLeaves)
      if let exercises = jsonResult as? [String:AnyObject] {
         if let warmups = exercises["Warmup"] as? [String:AnyObject] {
            print(warmups)
         }
      }
   } catch {
      print(error.localizedDescription)
   }
}

当我们运行这段代码时,我们将得到以下输出。

更新于:2020年6月27日

475 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告