0Pricing
Swift Academy · บทเรียน

CodingKeys สำหรับการเปลี่ยนชื่อ

จับคู่ชื่อใน JSON ที่แตกต่างจากชื่อคุณสมบัติ

CodingKeys สำหรับการเปลี่ยนชื่อ เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องเปลี่ยนชื่อคีย์

API ของ JSON มักใช้ชื่อที่แตกต่างจากชื่อพร็อพเพอร์ตีใน Swift เช่น first_name กับ firstName enum CodingKeys ทำหน้าที่เชื่อมชื่อทั้งสองแบบเข้าด้วยกันโดยไม่ต้องเปลี่ยน API ของแบบจำลอง

import Foundation

struct User: Codable {
    var firstName: String
    enum CodingKeys: String, CodingKey {
        case firstName = "first_name"
    }
}

print("CodingKeys maps firstName to first_name")

โครงสร้างของ CodingKeys

CodingKeys คือ enum ที่ซ้อนอยู่ภายในและสอดคล้องตาม String, CodingKey แต่ละ case จับคู่กับชื่อพร็อพเพอร์ตี ส่วนค่าดิบของ case คือคีย์ JSON ที่จะใช้

import Foundation

struct Product: Codable {
    var productName: String
    var unitPrice: Double
    enum CodingKeys: String, CodingKey {
        case productName = "product_name"
        case unitPrice = "unit_price"
    }
}

print(Product.CodingKeys.productName.rawValue)

การถอดรหัสด้วยคีย์ที่เปลี่ยนชื่อ

ขณะถอดรหัส ตัวถอดรหัสจะค้นหาพร็อพเพอร์ตีแต่ละตัวโดยใช้ค่าดิบใน CodingKeys ดังนั้น JSON รูปแบบ snake_case จึงเติมข้อมูลลงในพร็อพเพอร์ตีแบบ camelCase ได้

import Foundation

struct User: Codable {
    var firstName: String
    enum CodingKeys: String, CodingKey {
        case firstName = "first_name"
    }
}

let json = "{\"first_name\":\"Ada\"}"
let u = try JSONDecoder().decode(User.self, from: json.data(using: .utf8)!)
print(u.firstName)

การเข้ารหัสด้วยคีย์ที่เปลี่ยนชื่อ

การเข้ารหัสใช้การจับคู่แบบเดียวกันในทิศทางย้อนกลับ ดังนั้น JSON ผลลัพธ์จะมีคีย์ตามค่าดิบ ไม่ใช่ชื่อพร็อพเพอร์ตีของ Swift

import Foundation

struct User: Codable {
    var firstName: String
    enum CodingKeys: String, CodingKey {
        case firstName = "first_name"
    }
}

let data = try JSONEncoder().encode(User(firstName: "Ada"))
print(String(data: data, encoding: .utf8)!)

การระบุพร็อพเพอร์ตีทั้งหมด

เมื่อเพิ่ม enum CodingKeys แล้ว enum นั้นต้องมี case สำหรับทุกพร็อพเพอร์ตีที่ต้องการเข้ารหัสหรือถอดรหัส ส่วน case ที่ไม่มีค่าดิบจะใช้ชื่อพร็อพเพอร์ตีตามเดิม

import Foundation

struct Item: Codable {
    var id: Int
    var displayName: String
    enum CodingKeys: String, CodingKey {
        case id
        case displayName = "display_name"
    }
}

let data = try JSONEncoder().encode(Item(id: 1, displayName: "Pen"))
print(String(data: data, encoding: .utf8)!)

การละเว้นพร็อพเพอร์ตี

การไม่ใส่พร็อพเพอร์ตีไว้ใน CodingKeys จะตัดพร็อพเพอร์ตีนั้นออกจากการเข้ารหัสและถอดรหัส พร็อพเพอร์ตีดังกล่าวต้องมีค่าเริ่มต้น เพื่อให้ตัวเริ่มต้นที่สังเคราะห์ขึ้นยังสร้างชนิดข้อมูลได้

import Foundation

struct User: Codable {
    var name: String
    var cachedToken: String = "none"
    enum CodingKeys: String, CodingKey {
        case name
    }
}

let u = try JSONDecoder().decode(User.self, from: "{\"name\":\"Ada\"}".data(using: .utf8)!)
print(u.name, u.cachedToken)

การเปลี่ยนชื่อหลายคีย์

คุณสามารถจับคู่คีย์ได้มากเท่าที่ต้องการ แต่ละ case จะจับคู่พร็อพเพอร์ตีของ Swift กับคีย์ JSON ที่ตรงตามที่เซิร์ฟเวอร์คาดไว้

import Foundation

struct Account: Codable {
    var userId: Int
    var isVerified: Bool
    enum CodingKeys: String, CodingKey {
        case userId = "user_id"
        case isVerified = "is_verified"
    }
}

let json = "{\"user_id\":7,\"is_verified\":true}"
let a = try JSONDecoder().decode(Account.self, from: json.data(using: .utf8)!)
print(a.userId, a.isVerified)

การจับคู่กับชื่อที่เข้าใจง่ายขึ้น

CodingKeys ไม่ได้มีไว้สำหรับรูปแบบ snake_case เท่านั้น คุณยังใช้เปลี่ยนชื่อคีย์ API ที่เข้าใจยากให้เป็นชื่อพร็อพเพอร์ตีของ Swift ที่ชัดเจนได้

import Foundation

struct Reading: Codable {
    var temperature: Double
    enum CodingKeys: String, CodingKey {
        case temperature = "t"
    }
}

let json = "{\"t\":19.5}"
let r = try JSONDecoder().decode(Reading.self, from: json.data(using: .utf8)!)
print(r.temperature)

CodingKeys กับชนิดข้อมูลที่ซ้อนกัน

ชนิดข้อมูล Codable แต่ละชนิดมี CodingKeys ของตัวเอง โครงสร้างที่ซ้อนกันสามารถเปลี่ยนชื่อคีย์ของตัวเองได้อย่างอิสระจากชนิดข้อมูลภายนอก

import Foundation

struct Meta: Codable {
    var createdAt: String
    enum CodingKeys: String, CodingKey { case createdAt = "created_at" }
}
struct Doc: Codable { var title: String; var meta: Meta }

let json = "{\"title\":\"A\",\"meta\":{\"created_at\":\"today\"}}"
let d = try JSONDecoder().decode(Doc.self, from: json.data(using: .utf8)!)
print(d.meta.createdAt)

การแปลงไปกลับด้วยคีย์ที่เปลี่ยนชื่อ

CodingKeys เดียวกันจะควบคุมทั้งสองทิศทาง ดังนั้นค่าจึงถูกเข้ารหัสเป็นรูปแบบ snake_case และถอดรหัสกลับเป็นค่า Swift เดิมได้

import Foundation

struct User: Codable {
    var firstName: String
    var lastName: String
    enum CodingKeys: String, CodingKey {
        case firstName = "first_name"
        case lastName = "last_name"
    }
}

let u = User(firstName: "Ada", lastName: "Lovelace")
let data = try JSONEncoder().encode(u)
let back = try JSONDecoder().decode(User.self, from: data)
print(back.firstName, back.lastName)

เมื่อใดควรใช้ CodingKeys

ใช้ enum CodingKeys อย่างชัดเจนเมื่อจำเป็นต้องควบคุมคีย์แต่ละตัวอย่างแม่นยำ เมื่อมีเพียงบางคีย์ที่แตกต่างกัน หรือเมื่อต้องละเว้นพร็อพเพอร์ตี หาก API ใช้รูปแบบ snake_case อย่างสม่ำเสมอ กลยุทธ์การถอดรหัสอาจใช้งานง่ายกว่า

import Foundation

struct Event: Codable {
    var eventName: String
    var startTime: String
    enum CodingKeys: String, CodingKey {
        case eventName = "name"
        case startTime = "start_time"
    }
}

let json = "{\"name\":\"Launch\",\"start_time\":\"10:00\"}"
let e = try JSONDecoder().decode(Event.self, from: json.data(using: .utf8)!)
print(e.eventName, e.startTime)

ตรวจสอบความเข้าใจอย่างรวดเร็ว: CodingKeys

ทดสอบความเข้าใจของคุณเกี่ยวกับการเปลี่ยนชื่อคีย์

ทบทวน: CodingKeys สำหรับการเปลี่ยนชื่อ

คุณได้เรียนรู้วิธีควบคุมคีย์อย่างแม่นยำดังนี้

  • ประกาศ enum CodingKeys: String, CodingKey ไว้ภายในชนิดข้อมูล
  • ค่าดิบของแต่ละ case คือคีย์ JSON และ case เหล่านี้ควบคุมทั้งการเข้ารหัสและการถอดรหัส
  • ระบุพร็อพเพอร์ตีทุกตัวที่ต้องการเข้ารหัส การละเว้นพร็อพเพอร์ตีจะตัดพร็อพเพอร์ตีนั้นออก และพร็อพเพอร์ตีดังกล่าวต้องมีค่าเริ่มต้น
  • ชนิดข้อมูลที่ซ้อนกันมี CodingKeys ที่เป็นอิสระของตัวเอง

คำถามที่พบบ่อย

บทเรียน “CodingKeys สำหรับการเปลี่ยนชื่อ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “CodingKeys สำหรับการเปลี่ยนชื่อ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “CodingKeys สำหรับการเปลี่ยนชื่อ”

จับคู่ชื่อใน JSON ที่แตกต่างจากชื่อคุณสมบัติ คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “CodingKeys สำหรับการเปลี่ยนชื่อ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. CodingKeys สำหรับการเปลี่ยนชื่อ
  2. กลยุทธ์การถอดรหัสคีย์และวันที่
  3. การเข้ารหัสด้วยตนเองด้วย encode(to:) และ init(from:)
  4. การถอดรหัส JSON ต่างชนิด
← กลับไปที่ Swift Academy