กลยุทธ์การถอดรหัสคีย์และวันที่
ใช้ snake_case และกลยุทธ์สำหรับวันที่
กลยุทธ์การถอดรหัสคีย์และวันที่ เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
ภาพรวมกลยุทธ์การถอดรหัส
แทนที่จะเขียน enum CodingKeys สำหรับชนิดข้อมูลทุกชนิด คุณสามารถตั้งกลยุทธ์ส่วนกลางบน decoder ได้ กลยุทธ์เหล่านี้จะแปลงคีย์และแยกวิเคราะห์วันที่ให้เป็นรูปแบบเดียวกันในชนิดข้อมูลทั้งหมดที่ถอดรหัส
import Foundation
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
print("Strategy configured")convertFromSnakeCase
การตั้งค่า keyDecodingStrategy = .convertFromSnakeCase จะจับคู่คีย์อย่าง first_name กับคุณสมบัติแบบ camelCase อย่าง firstName โดยอัตโนมัติ โดยไม่ต้องใช้ CodingKeys
import Foundation
struct User: Codable {
var firstName: String
var lastName: String
}
let json = "{\"first_name\":\"Ada\",\"last_name\":\"Lovelace\"}"
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let u = try decoder.decode(User.self, from: json.data(using: .utf8)!)
print(u.firstName, u.lastName)การเข้ารหัสเป็นรูปแบบขีดล่าง
encoder มีตัวเลือกที่ทำงานในทางกลับกัน นั่นคือ keyEncodingStrategy = .convertToSnakeCase ซึ่งจะเขียนคุณสมบัติแบบ camelCase ออกมาเป็นคีย์ JSON แบบ snake_case
import Foundation
struct User: Codable {
var firstName: String
}
let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
let data = try encoder.encode(User(firstName: "Ada"))
print(String(data: data, encoding: .utf8)!)กลยุทธ์ใช้กับคีย์ทั้งหมด
กลยุทธ์คีย์จะใช้ในลักษณะเดียวกันกับคุณสมบัติทุกอย่างของชนิดข้อมูลที่ซ้อนกันทุกชนิด วิธีนี้เหมาะอย่างยิ่งเมื่อ API ทั้งหมดใช้รูปแบบ snake_case อย่างสม่ำเสมอ
import Foundation
struct Meta: Codable { var createdAt: String }
struct Doc: Codable { var docTitle: String; var docMeta: Meta }
let json = "{\"doc_title\":\"A\",\"doc_meta\":{\"created_at\":\"now\"}}"
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let d = try decoder.decode(Doc.self, from: json.data(using: .utf8)!)
print(d.docTitle, d.docMeta.createdAt)ปัญหาเรื่องวันที่
JSON ไม่มีชนิดข้อมูลวันที่ ค่า Date จะถูกเข้ารหัสเป็นตัวเลขหรือข้อความ และ decoder จำเป็นต้องทราบรูปแบบนั้น dateDecodingStrategy จะบอก decoder ว่าต้องแยกวิเคราะห์อย่างไร
import Foundation
struct Event: Codable {
var name: String
var date: Date
}
print("Date needs a strategy to parse")การถอดรหัสวันที่แบบ ISO-8601
dateDecodingStrategy = .iso8601 จะแยกวิเคราะห์การประทับเวลา ISO-8601 มาตรฐาน เช่น 2020-01-01T00:00:00Z ให้เป็นค่า Date
import Foundation
struct Event: Codable {
var name: String
var date: Date
}
let json = "{\"name\":\"Launch\",\"date\":\"2020-01-01T00:00:00Z\"}"
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let e = try decoder.decode(Event.self, from: json.data(using: .utf8)!)
print(e.date.timeIntervalSince1970)การเข้ารหัสวันที่แบบ ISO-8601
ตัวเลือกที่ทำงานคู่กันของ encoder คือ dateEncodingStrategy = .iso8601 ซึ่งจะเขียนค่า Date เป็นข้อความ ISO-8601
import Foundation
struct Event: Codable {
var name: String
var date: Date
}
let e = Event(name: "Launch", date: Date(timeIntervalSince1970: 1577836800))
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601
let data = try encoder.encode(e)
print(String(data: data, encoding: .utf8)!)กลยุทธ์ secondsSince1970
เมื่อ API ส่งการประทับเวลา Unix เป็นตัวเลข ให้ใช้ .secondsSince1970 เพื่อแปลค่าดังกล่าวเป็นจำนวนวินาทีนับตั้งแต่จุดเริ่มต้นของยุค
import Foundation
struct Event: Codable {
var date: Date
}
let json = "{\"date\":1577836800}"
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .secondsSince1970
let e = try decoder.decode(Event.self, from: json.data(using: .utf8)!)
print(e.date.timeIntervalSince1970)รูปแบบวันที่ที่กำหนดเอง
สำหรับรูปแบบที่ไม่เป็นมาตรฐาน ให้ส่ง DateFormatter ผ่าน .formatted(_:) วิธีนี้รองรับวันที่อย่าง 2020-01-01 ที่ไม่มีส่วนของเวลา
import Foundation
struct Event: Codable { var date: Date }
let fmt = DateFormatter()
fmt.dateFormat = "yyyy-MM-dd"
fmt.timeZone = TimeZone(identifier: "UTC")
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(fmt)
let e = try decoder.decode(Event.self, from: "{\"date\":\"2020-01-01\"}".data(using: .utf8)!)
print(e.date.timeIntervalSince1970)การรวมกลยุทธ์
คุณสามารถตั้งกลยุทธ์คีย์และกลยุทธ์วันที่ร่วมกันบน decoder เดียวกันได้ ทำให้จัดการ API ที่ใช้ snake_case และ ISO-8601 ได้โดยไม่ต้องเขียนโค้ดซ้ำสำหรับแต่ละชนิดข้อมูล
import Foundation
struct LogEntry: Codable {
var eventName: String
var occurredAt: Date
}
let json = "{\"event_name\":\"login\",\"occurred_at\":\"2020-01-01T00:00:00Z\"}"
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
decoder.dateDecodingStrategy = .iso8601
let entry = try decoder.decode(LogEntry.self, from: json.data(using: .utf8)!)
print(entry.eventName, entry.occurredAt.timeIntervalSince1970)กลยุทธ์เทียบกับ CodingKeys
กลยุทธ์ส่วนกลางกระชับและเหมาะกับ API ที่ใช้รูปแบบเดียวกัน หากมีคีย์เพียงไม่กี่รายการที่แตกต่างกัน หรือชื่อมีรูปแบบไม่สม่ำเสมอ enum CodingKeys ที่ระบุอย่างชัดเจนจะช่วยควบคุมคีย์แต่ละรายการได้อย่างแม่นยำ และยังสามารถใช้ทั้งสองวิธีร่วมกันได้
import Foundation
struct Item: Codable {
var itemName: String
}
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let i = try decoder.decode(Item.self, from: "{\"item_name\":\"Pen\"}".data(using: .utf8)!)
print(i.itemName)ตรวจความเข้าใจอย่างรวดเร็ว: กลยุทธ์
ทดสอบความเข้าใจของคุณเกี่ยวกับกลยุทธ์การถอดรหัส
ทบทวน: กลยุทธ์คีย์และวันที่
คุณได้เรียนรู้การกำหนดค่า coder ส่วนกลางแล้ว:
keyDecodingStrategy = .convertFromSnakeCaseจะแปลง snake_case เป็น camelCase ส่วน.convertToSnakeCaseจะเข้ารหัสในทิศทางตรงกันข้ามdateDecodingStrategy = .iso8601จะแยกวิเคราะห์การประทับเวลา ISO ส่วน.secondsSince1970และ.formatted(_:)รองรับรูปแบบอื่น ๆ- กลยุทธ์จะใช้กับชนิดข้อมูลที่ซ้อนกันทุกชนิดในลักษณะเดียวกัน
- ใช้กลยุทธ์กับ API ที่มีรูปแบบสม่ำเสมอ และใช้
CodingKeysกับ API ที่มีรูปแบบไม่สม่ำเสมอ
คำถามที่พบบ่อย
บทเรียน “กลยุทธ์การถอดรหัสคีย์และวันที่” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “กลยุทธ์การถอดรหัสคีย์และวันที่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “กลยุทธ์การถอดรหัสคีย์และวันที่”
ใช้ snake_case และกลยุทธ์สำหรับวันที่ คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “กลยุทธ์การถอดรหัสคีย์และวันที่” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- CodingKeys สำหรับการเปลี่ยนชื่อ
- กลยุทธ์การถอดรหัสคีย์และวันที่
- การเข้ารหัสด้วยตนเองด้วย encode(to:) และ init(from:)
- การถอดรหัส JSON ต่างชนิด