การถอดรหัสด้วย JSONDecoder
แยกวิเคราะห์ข้อมูล JSON ให้เป็นค่าของ Swift ที่มีชนิด
การถอดรหัสด้วย JSONDecoder เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
การสร้าง JSONDecoder
JSONDecoder สร้างค่าของ Swift กลับจาก Data ในรูปแบบ JSON คุณระบุชนิดข้อมูลที่ต้องการให้สร้าง แล้วส่งไบต์ให้ตัวถอดรหัส
import Foundation
struct City: Codable {
var name: String
var population: Int
}
let json = "{\"name\":\"Oslo\",\"population\":700000}"
let data = json.data(using: .utf8)!
let city = try JSONDecoder().decode(City.self, from: data)
print(city.name, city.population)การส่งชนิดข้อมูลด้วย .self
อาร์กิวเมนต์แรกคือเมทาไทป์ ซึ่งเขียนเป็น MyType.self วิธีนี้จะบอกตัวถอดรหัสว่าควรสร้างโครงสร้างใดจากข้อมูล
import Foundation
struct Flag: Codable { var ok: Bool }
let data = "{\"ok\":true}".data(using: .utf8)!
let result = try JSONDecoder().decode(Flag.self, from: data)
print(result.ok)การถอดรหัสอาร์เรย์
หากต้องการถอดรหัสอาร์เรย์ JSON ให้ระบุชนิดอาร์เรย์ เช่น [Int].self หรือ [MyStruct].self
import Foundation
let json = "[10, 20, 30]"
let data = json.data(using: .utf8)!
let numbers = try JSONDecoder().decode([Int].self, from: data)
print(numbers.reduce(0, +))การถอดรหัสออบเจ็กต์ที่ซ้อนกัน
ออบเจ็กต์ JSON ที่ซ้อนกันจะจับคู่กับโครงสร้าง Codable ที่ซ้อนกัน ตัวถอดรหัสจะเดินไปตามโครงสร้างต้นไม้และเติมข้อมูลในแต่ละระดับให้คุณ
import Foundation
struct Coord: Codable { var lat: Double; var lon: Double }
struct Place: Codable { var name: String; var coord: Coord }
let json = "{\"name\":\"X\",\"coord\":{\"lat\":1.0,\"lon\":2.0}}"
let p = try JSONDecoder().decode(Place.self, from: json.data(using: .utf8)!)
print(p.coord.lat, p.coord.lon)การดักจับข้อผิดพลาดในการถอดรหัส
decode จะโยนข้อผิดพลาดเมื่อข้อมูลไม่ตรงกับชนิดข้อมูล ให้ครอบด้วย do/catch เพื่อจัดการข้อมูลนำเข้าที่มีรูปแบบไม่ถูกต้องอย่างเหมาะสม
import Foundation
struct User: Codable { var name: String }
let bad = "{\"wrong\":1}".data(using: .utf8)!
do {
let u = try JSONDecoder().decode(User.self, from: bad)
print(u.name)
} catch {
print("Failed:", error)
}ข้อผิดพลาด keyNotFound
ความล้มเหลวที่พบบ่อยคือ DecodingError.keyNotFound ซึ่งถูกโยนเมื่อคีย์ที่จำเป็นหายไป ให้ตรวจสอบรูปแบบของข้อผิดพลาดเพื่อรายงานได้อย่างแม่นยำว่าเกิดอะไรขึ้น
import Foundation
struct User: Codable { var name: String }
let bad = "{}".data(using: .utf8)!
do {
_ = try JSONDecoder().decode(User.self, from: bad)
} catch let DecodingError.keyNotFound(key, _) {
print("Missing key:", key.stringValue)
} catch {
print("Other error:", error)
}ข้อผิดพลาด typeMismatch
หากค่ามีชนิดข้อมูล JSON ไม่ถูกต้อง เช่น ได้สตริงในตำแหน่งที่คาดว่าจะเป็น Int ตัวถอดรหัสจะโยน DecodingError.typeMismatch
import Foundation
struct Count: Codable { var n: Int }
let bad = "{\"n\":\"oops\"}".data(using: .utf8)!
do {
_ = try JSONDecoder().decode(Count.self, from: bad)
} catch let DecodingError.typeMismatch(type, _) {
print("Type mismatch, expected:", type)
} catch {
print("Other:", error)
}ข้อผิดพลาด dataCorrupted
ไวยากรณ์ JSON ที่ไม่ถูกต้องจะทำให้เกิด DecodingError.dataCorrupted โดยปกติหมายความว่าไบต์ดังกล่าวไม่ใช่ JSON ที่ถูกต้องเลย
import Foundation
struct User: Codable { var name: String }
let bad = "not json".data(using: .utf8)!
do {
_ = try JSONDecoder().decode(User.self, from: bad)
} catch is DecodingError {
print("Decoding failed: data corrupted")
} catch {
print("Other:", error)
}การถอดรหัสเป็นค่าออปชันนัล
หากพร็อพเพอร์ตีเป็นค่าออปชันนัล คีย์ที่หายไปจะถูกถอดรหัสเป็น nil โดยไม่โยนข้อผิดพลาด ทำให้ฟิลด์ออปชันนัลรองรับข้อมูลที่ไม่มีอยู่ได้
import Foundation
struct Profile: Codable {
var name: String
var bio: String?
}
let json = "{\"name\":\"Kai\"}"
let p = try JSONDecoder().decode(Profile.self, from: json.data(using: .utf8)!)
print(p.name, p.bio ?? "no bio")การใช้ตัวถอดรหัสซ้ำ
เช่นเดียวกับตัวเข้ารหัส คุณสามารถใช้ JSONDecoder ที่กำหนดค่าแล้วซ้ำกับข้อมูลที่ส่งเข้ามาหลายชุดได้ เก็บอินสแตนซ์หนึ่งไว้ แล้วใช้ถอดรหัสข้อมูลนำเข้าที่แตกต่างกัน
import Foundation
struct Word: Codable { var text: String }
let decoder = JSONDecoder()
let inputs = ["{\"text\":\"hi\"}", "{\"text\":\"bye\"}"]
for s in inputs {
let w = try decoder.decode(Word.self, from: s.data(using: .utf8)!)
print(w.text)
}ถอดรหัส ตรวจสอบ และนำไปใช้
ลำดับการทำงานทั้งหมดคือ รับ Data ถอดรหัสเป็นค่าที่มีชนิดข้อมูลภายใน do/catch แล้วนำผลลัพธ์ที่มีชนิดข้อมูลชัดเจนไปใช้งานอย่างปลอดภัย
import Foundation
struct Weather: Codable {
var city: String
var temp: Double
}
let json = "{\"city\":\"Rome\",\"temp\":21.5}"
do {
let w = try JSONDecoder().decode(Weather.self, from: json.data(using: .utf8)!)
print("\(w.city): \(w.temp)C")
} catch {
print("Decode error:", error)
}ตรวจสอบความเข้าใจอย่างรวดเร็ว: JSONDecoder
ทดสอบความรู้ของคุณเกี่ยวกับการถอดรหัส
ทบทวน: การถอดรหัสด้วย JSONDecoder
คุณได้เรียนรู้วิธีสร้างค่าของ Swift กลับจาก JSON ดังนี้
decode(MyType.self, from: data)จะสร้างค่าที่มีชนิดข้อมูลเฉพาะ- อาร์เรย์ ออบเจ็กต์ที่ซ้อนกัน และค่าออปชันนัลจะถูกถอดรหัสโดยอัตโนมัติ
decodeจะโยนกรณีต่าง ๆ ของDecodingErrorได้แก่keyNotFound,typeMismatch,dataCorruptedและvalueNotFound- ครอบการเรียกใช้ด้วย
do/catchเพื่อจัดการข้อมูลนำเข้าที่มีรูปแบบไม่ถูกต้อง
คำถามที่พบบ่อย
บทเรียน “การถอดรหัสด้วย JSONDecoder” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การถอดรหัสด้วย JSONDecoder” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การถอดรหัสด้วย JSONDecoder”
แยกวิเคราะห์ข้อมูล JSON ให้เป็นค่าของ Swift ที่มีชนิด คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การถอดรหัสด้วย JSONDecoder” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การทำให้สอดคล้องกับ Codable
- การเข้ารหัสด้วย JSONEncoder
- การถอดรหัสด้วย JSONDecoder
- การจัดการชนิดค่าเสริมและชนิดซ้อนกัน