Heterojen JSON Kodunu Çözme
Polimorfik ve dinamik JSON biçimlerini işleyin.
Heterojen JSON Kodunu Çözme, CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Swift Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Swift Academy kursu toplamda 4 dersten oluşur.
Heterojen JSON Nedir
Bazı API'ler, nesnelerin farklı biçimlere sahip olduğu ve bir type alanıyla birbirinden ayrıldığı diziler döndürür. Bunları tek bir Swift türüne kod çözerek aktarmak için önce bu ayırt edici alanı incelemek gerekir.
import Foundation
let json = "[{\"type\":\"text\",\"value\":\"hi\"},{\"type\":\"number\",\"value\":42}]"
print("Each element carries a type discriminator")Numaralandırmayla Modelleme
Doğal bir Swift modeli, ilişkili değerlere sahip bir numaralandırmadır — her JSON biçimi için bir durum bulunur. Kod çözücü, durumu ayırt edici alana göre seçer.
import Foundation
enum Block {
case text(String)
case number(Int)
}
print("Enum models the variants")Ayırt Edici Anahtarı Tanımlama
Ayırt edici alanı (burada type) ve okumanız gereken yük anahtarlarını içeren bir CodingKeys numaralandırması ekleyin.
import Foundation
enum CodingKeys: String, CodingKey {
case type
case value
}
print(CodingKeys.type.stringValue, CodingKeys.value.stringValue)Ayırt Edici Alanı Okuma
init(from:) içinde önce type dizesinin kodunu çözün, ardından eşleşen yükü çözmek için bu değer üzerinde seçim yapın.
import Foundation
enum Block: Decodable {
case text(String)
case number(Int)
enum CodingKeys: String, CodingKey { case type, value }
init(from decoder: Decoder) throws {
let c = try decoder.container(keyedBy: CodingKeys.self)
let type = try c.decode(String.self, forKey: .type)
switch type {
case "text": self = .text(try c.decode(String.self, forKey: .value))
case "number": self = .number(try c.decode(Int.self, forKey: .value))
default: throw DecodingError.dataCorruptedError(forKey: .type, in: c, debugDescription: "unknown type")
}
}
}
let b = try JSONDecoder().decode(Block.self, from: "{\"type\":\"text\",\"value\":\"hi\"}".data(using: .utf8)!)
if case let .text(s) = b { print(s) }Karışık Bir Dizinin Kodunu Çözme
Numaralandırma Decodable olduğunda, [Block].self ifadesinin kodunu çözmek, farklı biçimlerden oluşan bir dizinin tamamını tek çağrıda işler.
import Foundation
enum Block: Decodable {
case text(String)
case number(Int)
enum CodingKeys: String, CodingKey { case type, value }
init(from decoder: Decoder) throws {
let c = try decoder.container(keyedBy: CodingKeys.self)
switch try c.decode(String.self, forKey: .type) {
case "text": self = .text(try c.decode(String.self, forKey: .value))
case "number": self = .number(try c.decode(Int.self, forKey: .value))
default: throw DecodingError.dataCorruptedError(forKey: .type, in: c, debugDescription: "unknown")
}
}
}
let json = "[{\"type\":\"text\",\"value\":\"hi\"},{\"type\":\"number\",\"value\":42}]"
let blocks = try JSONDecoder().decode([Block].self, from: json.data(using: .utf8)!)
print(blocks.count)Sonucu Örüntüyle Eşleştirme
Kod çözme işleminden sonra, her varyant üzerinde tür güvenli bir şekilde işlem yapmak için numaralandırma üzerinde seçim yapın.
import Foundation
enum Block: Decodable {
case text(String)
case number(Int)
enum CodingKeys: String, CodingKey { case type, value }
init(from decoder: Decoder) throws {
let c = try decoder.container(keyedBy: CodingKeys.self)
switch try c.decode(String.self, forKey: .type) {
case "text": self = .text(try c.decode(String.self, forKey: .value))
case "number": self = .number(try c.decode(Int.self, forKey: .value))
default: throw DecodingError.dataCorruptedError(forKey: .type, in: c, debugDescription: "unknown")
}
}
}
let json = "[{\"type\":\"text\",\"value\":\"hi\"},{\"type\":\"number\",\"value\":42}]"
for b in try JSONDecoder().decode([Block].self, from: json.data(using: .utf8)!) {
switch b {
case .text(let s): print("text:", s)
case .number(let n): print("number:", n)
}
}İç İçe Yükler
Varyantlar daha zengin veriler taşıdığında, her durum için tek bir değer yerine iç içe bir Codable yapısının kodunu çözün.
import Foundation
struct ImagePayload: Decodable { var url: String; var width: Int }
enum Block: Decodable {
case image(ImagePayload)
enum CodingKeys: String, CodingKey { case type }
init(from decoder: Decoder) throws {
let c = try decoder.container(keyedBy: CodingKeys.self)
switch try c.decode(String.self, forKey: .type) {
case "image": self = .image(try ImagePayload(from: decoder))
default: throw DecodingError.dataCorruptedError(forKey: .type, in: c, debugDescription: "unknown")
}
}
}
let json = "{\"type\":\"image\",\"url\":\"a.png\",\"width\":100}"
if case let .image(p) = try JSONDecoder().decode(Block.self, from: json.data(using: .utf8)!) {
print(p.url, p.width)
}Bilinmeyen Türleri Sorunsuz İşleme
Bilinmeyen ayırt edici alanlarda hata fırlatmak yerine, bunları bir geri dönüş durumuna eşleyebilirsiniz; böylece yeni sunucu türleri istemcinin çökmesine asla neden olmaz.
import Foundation
enum Block: Decodable {
case text(String)
case unknown
enum CodingKeys: String, CodingKey { case type, value }
init(from decoder: Decoder) throws {
let c = try decoder.container(keyedBy: CodingKeys.self)
switch try c.decode(String.self, forKey: .type) {
case "text": self = .text(try c.decode(String.self, forKey: .value))
default: self = .unknown
}
}
}
let b = try JSONDecoder().decode(Block.self, from: "{\"type\":\"video\"}".data(using: .utf8)!)
if case .unknown = b { print("fell back to unknown") }İyi Bir Ayırt Edici Alan Seçme
Ayırt edici alan kararlı ve zorunlu olmalıdır. Bilinen tür adlarından oluşan bir String numaralandırması, seçim işleminin tüm durumları kapsamasını ve okunabilir olmasını sağlar.
import Foundation
enum Kind: String, Decodable { case text, number }
let data = "\"text\"".data(using: .utf8)!
let k = try JSONDecoder().decode(Kind.self, from: data)
print(k == .text)Polimorfik Değerleri Kodlama
Gidiş-dönüş kodlaması için encode(to:) yöntemini de uygulayın: ayırt edici alanı ve varyantın yükünü yeniden yazın.
import Foundation
enum Block: Encodable {
case text(String)
case number(Int)
enum CodingKeys: String, CodingKey { case type, value }
func encode(to encoder: Encoder) throws {
var c = encoder.container(keyedBy: CodingKeys.self)
switch self {
case .text(let s):
try c.encode("text", forKey: .type)
try c.encode(s, forKey: .value)
case .number(let n):
try c.encode("number", forKey: .type)
try c.encode(n, forKey: .value)
}
}
}
let data = try JSONEncoder().encode(Block.number(42))
print(String(data: data, encoding: .utf8)!)Hepsini Bir Araya Getirme
Eksiksiz bir polimorfik model, karışık bir dizinin kodunu çözer, her varyant üzerinde seçim yapar ve aynı biçime geri kodlayabilir — esnek API'ler için sağlam bir kalıptır.
import Foundation
enum Block: Codable {
case text(String)
case number(Int)
enum CodingKeys: String, CodingKey { case type, value }
init(from d: Decoder) throws {
let c = try d.container(keyedBy: CodingKeys.self)
switch try c.decode(String.self, forKey: .type) {
case "text": self = .text(try c.decode(String.self, forKey: .value))
default: self = .number(try c.decode(Int.self, forKey: .value))
}
}
func encode(to e: Encoder) throws {
var c = e.container(keyedBy: CodingKeys.self)
switch self {
case .text(let s): try c.encode("text", forKey: .type); try c.encode(s, forKey: .value)
case .number(let n): try c.encode("number", forKey: .type); try c.encode(n, forKey: .value)
}
}
}
let blocks: [Block] = [.text("hi"), .number(7)]
let data = try JSONEncoder().encode(blocks)
print(try JSONDecoder().decode([Block].self, from: data).count)Hızlı Kontrol: Heterojen JSON
Polimorfik kod çözme konusundaki anlayışınızı sınayın.
Özet: Heterojen JSON Kodunu Çözme
Polimorfik yükleri işlemeyi öğrendiniz:
- Varyantları, ilişkili değerlere sahip bir numaralandırma olarak modelleyin.
init(from:)içinde ayırt edici alanın kodunu çözün, ardından doğru durumu oluşturmak için seçim yapın.[Enum].selfile karışık dizilerin kodunu çözün ve sonuçları örüntüyle eşleştirin.- Bilinmeyen türler için bir geri dönüş durumu ekleyin ve gidiş-dönüş kodlaması için
encode(to:)yöntemini uygulayın.
Yapay zeka eğitmeniyle Swift öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 122
- Dersler
- 409
Sıkça Sorulan Sorular
“Heterojen JSON Kodunu Çözme” dersi ücretsiz mi?
Evet — “Heterojen JSON Kodunu Çözme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Swift Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Swift Academy kursu toplamda 4 dersten oluşur.
“Heterojen JSON Kodunu Çözme” dersinde ne öğreneceğim?
Polimorfik ve dinamik JSON biçimlerini işleyin. Swift Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Swift Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Swift Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Heterojen JSON Kodunu Çözme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Swift Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Swift Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Yeniden Adlandırma için CodingKeys
- Anahtar ve Tarih Kod Çözme Stratejileri
- Elle encode(to:) ve init(from:)
- Heterojen JSON Kodunu Çözme