JSON ย่อมาจาก Javascript object notation โดยส่วนมากเมื่อจัดการกับ APIs หรือบริการอื่นๆ ข้อมูลจะคืนมาในรูปแบบ JSON และเราต้องแปลงเป็นรูปแบบภาษาที่ใช้งานได้และรองรับ
Foundation framework ของ iOS มีคลาส JSONSerialization สำหรับแปลง JSON เป็นรูปแบบที่รองรับ เช่น Dictionary, strings, Bool ฯลฯ
คลาส JSONSerialization มีเมธอด jsonObject(with:options:) ที่ parse json และคืนค่า Any เป็นผลลัพธ์ และ error หากข้อมูลไม่สามารถ parse ได้
// Example JSON: /* { "age": 42.0, "name": { "firstName": "tut" } } */ลองดูด้วยตัวอย่างอีกตัว สมมติเราได้ข้อมูลจาก API call ตอนนี้เพื่อ parse ข้อมูลนี้ เราจะใช้ JSONSerialization.jsonObject(with:options:)
if let data = data, let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] { }// ตอนนี้ json object ข้างต้นมีข้อมูลที่ได้รับเป็น dictionary ของ String และ Any หรือจะไปที่ else ของ if let block
// สมมติ json มี key "Student" และค่าที่เกี่ยวข้องคือ dictionary
guard let student = json["Student"] as? [String: Any] else { return }นี่คือวิธีที่เราสามารถ parse json และได้ค่าจากมัน เราสามารถปรับปรุงเพิ่มเติมได้โดยใช้ models และ initializers มาลองดูตัวอย่างโดยสร้าง local json file และพยายาม parse มัน
มาสร้าง json file ด้วยข้อมูลต่อไปนี้และบันทึกเป็น exercises.json
{ "Warmup": { "Exercises": [ { "Name": "Neck Strech", "images": [ "http:sdf.com", "sdf", "sdf", "sdf" ], "time": 30 } ] } }เราจะ parse local 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) } }เมื่อเรารันโค้ดนี้ ผลลัพธ์ที่ได้คือ
