Decodifica con JSONDecoder
Analizzi i dati JSON trasformandoli in valori Swift tipizzati.
Decodifica con JSONDecoder è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 3 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.
Creazione di un JSONDecoder
JSONDecoder ricostruisce un valore Swift a partire dai Data JSON. Gli indichi il tipo da produrre e gli fornisca i byte.
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)Passaggio del tipo con .self
Il primo argomento è il metatipo, scritto MyType.self. In questo modo indica al decoder quale struttura creare a partire dai dati.
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)Decodifica degli array
Per decodificare un array JSON, richieda un tipo array come [Int].self o [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, +))Decodifica degli oggetti annidati
Gli oggetti JSON annidati corrispondono a struct Codable annidate. Il decoder percorre l'albero e compila per Lei ogni livello.
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)Gestione degli errori di decodifica
decode genera un errore quando i dati non corrispondono al tipo. Lo racchiuda in do/catch per gestire con eleganza gli input non validi.
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)
}Errori keyNotFound
Un errore comune è DecodingError.keyNotFound, generato quando manca una chiave obbligatoria. Utilizzi il pattern matching sull'errore per segnalare esattamente che cosa non ha funzionato.
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)
}Errori typeMismatch
Se un valore ha un tipo JSON errato, ad esempio una stringa dove è previsto un Int, il decoder genera 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)
}Errori dataCorrupted
Una sintassi JSON non valida genera DecodingError.dataCorrupted. Di solito significa che i byte non rappresentano affatto un JSON valido.
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)
}Decodifica negli opzionali
Se una proprietà è opzionale, una chiave mancante viene decodificata come nil senza generare errori. In questo modo i campi opzionali tollerano l'assenza dei dati.
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")Riutilizzo di un decoder
Come l'encoder, un JSONDecoder configurato può essere riutilizzato per molti payload. Mantenga una sola istanza e la utilizzi per decodificare input diversi.
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)
}Decodificare, esaminare, utilizzare
Un flusso completo consiste nel ricevere i Data, decodificarli in un valore tipizzato all'interno di do/catch e quindi utilizzare in sicurezza il risultato fortemente tipizzato.
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)
}Verifica rapida: JSONDecoder
Verifichi le Sue conoscenze sulla decodifica.
Riepilogo: decodifica con JSONDecoder
Ha imparato a ricostruire i valori Swift dal JSON:
decode(MyType.self, from: data)produce un valore tipizzato.- Array, oggetti annidati e opzionali vengono decodificati automaticamente.
decodegenera i casi diDecodingError:keyNotFound,typeMismatch,dataCorrupted,valueNotFound.- Racchiuda le chiamate in
do/catchper gestire gli input non validi.
Domande Frequenti
La lezione «Decodifica con JSONDecoder» è gratuita?
Sì — il testo completo di «Decodifica con JSONDecoder» è 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 «Decodifica con JSONDecoder»?
Analizzi i dati JSON trasformandoli in valori Swift tipizzati. 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 3 di 4.
Quanto tempo richiede la lezione «Decodifica con JSONDecoder»?
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
- Conformità a Codable
- Codifica con JSONEncoder
- Decodifica con JSONDecoder
- Gestione di tipi optional e annidati