如何在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) } }
当我们运行这段代码时,我们将得到以下输出。
广告