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)
}
} เมื่อเรารันโค้ดนี้ ด้านล่างนี้คือผลลัพธ์ที่เราได้รับ
