Decodificación con JSONDecoder
Analice datos JSON y conviértalos en valores tipados de Swift.
Decodificación con JSONDecoder es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.
Creación de un JSONDecoder
JSONDecoder reconstruye un valor de Swift a partir de Data JSON. Debe indicarle el tipo que quiere producir y proporcionarle los bytes.
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)Pasar el tipo con .self
El primer argumento es el metatipo, escrito como MyType.self. Esto indica al decoder qué estructura debe construir a partir de los datos.
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)Decodificación de arrays
Para decodificar un array JSON, solicite un tipo de array como [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, +))Decodificación de objetos anidados
Los objetos JSON anidados se corresponden con structs Codable anidados. El decoder recorre el árbol y rellena cada nivel por usted.
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)Captura de errores de decodificación
decode lanza un error cuando los datos no coinciden con el tipo. Envuélvalo en do/catch para gestionar las entradas con formato incorrecto de manera adecuada.
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)
}Errores keyNotFound
Un error frecuente es DecodingError.keyNotFound, que se lanza cuando falta una clave obligatoria. Analice el error mediante pattern matching para informar exactamente de lo que ha fallado.
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)
}Errores typeMismatch
Si un valor tiene un tipo JSON incorrecto, por ejemplo, un string donde se espera un Int, el decoder lanza 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)
}Errores dataCorrupted
Una sintaxis JSON no válida genera DecodingError.dataCorrupted. Esto normalmente significa que los bytes no contienen JSON válido.
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)
}Decodificación en optionals
Si una propiedad es optional, una clave ausente se decodifica como nil sin lanzar un error. Esto hace que los campos opcionales toleren la ausencia de datos.
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")Reutilización de un decoder
Al igual que el encoder, puede reutilizar un JSONDecoder configurado para muchas cargas útiles. Mantenga una instancia y decodifique con ella distintas entradas.
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)
}Decodificar, inspeccionar y utilizar
Un flujo completo consiste en recibir Data, decodificarlo en un valor tipado dentro de do/catch y utilizar después el resultado fuertemente tipado de forma segura.
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)
}Comprobación rápida: JSONDecoder
Compruebe sus conocimientos sobre decodificación.
Resumen: decodificación con JSONDecoder
Ha aprendido a reconstruir valores de Swift a partir de JSON:
decode(MyType.self, from: data)produce un valor tipado.- Los arrays, objetos anidados y optionals se decodifican automáticamente.
decodelanza casos deDecodingError:keyNotFound,typeMismatch,dataCorruptedyvalueNotFound.- Envuelva las llamadas en
do/catchpara gestionar las entradas con formato incorrecto.
Preguntas frecuentes
¿La lección «Decodificación con JSONDecoder» es gratis?
Sí — el texto completo de «Decodificación con JSONDecoder» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Decodificación con JSONDecoder»?
Analice datos JSON y conviértalos en valores tipados de Swift. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Swift Academy?
No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Decodificación con JSONDecoder»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Swift Academy?
Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Conformidad con Codable
- Codificación con JSONEncoder
- Decodificación con JSONDecoder
- Gestión de tipos opcionales y anidados