JSON ย่อมาจากสัญกรณ์วัตถุ Javascript ส่วนใหญ่เมื่อต้องจัดการกับ API หรือบริการอื่นๆ ข้อมูลจะถูกส่งคืนในรูปแบบ JSON และเราจำเป็นต้องแปลงเป็นรูปแบบภาษาที่ใช้งานได้และรองรับ
เฟรมเวิร์กพื้นฐานของ iOS มีคลาส JSONSerialization เพื่อแปลง JSON เป็นรูปแบบที่รองรับ เช่น พจนานุกรม สตริง บูล เป็นต้น
คลาส JSONSerialization จัดเตรียมวิธีการ jsonObject(with:options:) ที่แยกวิเคราะห์ json และส่งคืนผลลัพธ์ใด ๆ และเกิดข้อผิดพลาดหากไม่สามารถแยกวิเคราะห์ข้อมูลได้
// 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 ด้านบนมีข้อมูลที่ได้รับเป็นพจนานุกรมของ String และ Any หรือถ้าปล่อยให้บล็อกไปที่อื่น
// สมมติว่า 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) } }
เมื่อเรารันโค้ดนี้ ด้านล่างนี้คือผลลัพธ์ที่เราได้รับ