Strategie di decodifica per chiavi e date
Usi snake_case e le strategie per le date.
Strategie di decodifica per chiavi e date è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.
Panoramica delle strategie di decodifica
Invece di scrivere un'enum CodingKeys per ogni tipo, è possibile impostare una strategia globale sul decoder. Le strategie trasformano le chiavi e analizzano le date in modo uniforme per tutti i tipi decodificati.
import Foundation
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
print("Strategy configured")convertFromSnakeCase
Impostando keyDecodingStrategy = .convertFromSnakeCase, le chiavi come first_name vengono convertite automaticamente nella proprietà camelCase firstName, senza bisogno di 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)Codifica in snake_case
L'encoder offre l'opzione corrispondente: keyEncodingStrategy = .convertToSnakeCase scrive le proprietà camelCase come chiavi JSON in 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)!)La strategia si applica a tutte le chiavi
Una strategia per le chiavi si applica in modo uniforme a ogni proprietà di ogni tipo annidato. È la soluzione ideale quando un'intera API usa in modo coerente il formato 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)Il problema delle date
JSON non dispone di un tipo per le date. I valori Date vengono codificati come numeri o stringhe e il decoder deve conoscerne il formato. dateDecodingStrategy gli indica come interpretarli.
import Foundation
struct Event: Codable {
var name: String
var date: Date
}
print("Date needs a strategy to parse")Decodifica delle date iso8601
dateDecodingStrategy = .iso8601 analizza timestamp ISO-8601 standard come 2020-01-01T00:00:00Z e li converte in valori 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)Codifica delle date iso8601
L'opzione corrispondente dell'encoder è dateEncodingStrategy = .iso8601, che scrive i valori Date come stringhe 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)!)Strategia secondsSince1970
Quando un'API invia timestamp Unix come numeri, usate .secondsSince1970 per interpretarli come secondi trascorsi dall'epoca Unix.
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)Formati di data personalizzati
Per i formati non standard, fornite un DateFormatter tramite .formatted(_:). In questo modo è possibile gestire date come 2020-01-01 prive della componente oraria.
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)Combinare le strategie
È possibile impostare insieme le strategie per le chiavi e per le date sullo stesso decoder, così da gestire un'API in snake_case e ISO-8601 senza codice ripetitivo specifico per ogni tipo.
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)Strategia e CodingKeys a confronto
Una strategia globale è concisa per le API uniformi. Quando solo alcune chiavi sono diverse o i nomi seguono regole irregolari, un'enum CodingKeys esplicita offre un controllo preciso su ogni chiave. È anche possibile combinarle.
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)Verifica rapida: strategie
Verificate la vostra comprensione delle strategie di decodifica.
Riepilogo: strategie per chiavi e date
Avete imparato a configurare globalmente i coder:
keyDecodingStrategy = .convertFromSnakeCaseconverte lo snake_case in camelCase;.convertToSnakeCaseesegue la codifica nella direzione opposta.dateDecodingStrategy = .iso8601analizza i timestamp ISO;.secondsSince1970e.formatted(_:)gestiscono gli altri formati.- Le strategie si applicano in modo uniforme a ogni tipo annidato.
- Usate le strategie per le API uniformi e
CodingKeysper quelle irregolari.
Domande Frequenti
La lezione «Strategie di decodifica per chiavi e date» è gratuita?
Sì — il testo completo di «Strategie di decodifica per chiavi e date» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.
Cosa imparerò in «Strategie di decodifica per chiavi e date»?
Usi snake_case e le strategie per le date. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Swift Academy?
Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Strategie di decodifica per chiavi e date»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Swift Academy?
Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- CodingKeys per rinominare
- Strategie di decodifica per chiavi e date
- encode(to:) e init(from:) manuali
- Decodifica di JSON eterogenei