0Pricing
Swift Academy · Lezione

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.
  • decode genera i casi di DecodingError: keyNotFound, typeMismatch, dataCorrupted, valueNotFound.
  • Racchiuda le chiamate in do/catch per 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

  1. Conformità a Codable
  2. Codifica con JSONEncoder
  3. Decodifica con JSONDecoder
  4. Gestione di tipi optional e annidati
← Torna a Swift Academy