Dekoodaus JSONDecoderilla
Jäsennä JSON-data tyypitetyiksi Swift-arvoiksi.
Dekoodaus JSONDecoderilla on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Swift Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Swift Academy-kurssilla on yhteensä 4 oppituntia.
JSONDecoder-purkajan luominen
JSONDecoder muodostaa Swift-arvon uudelleen JSON-muotoisesta Data-tietosisällöstä. Ilmoittakaa sille tuotettava tyyppi ja antakaa sille tavut.
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)Tyypin välittäminen .self-arvolla
Ensimmäinen argumentti on metatyyppi, joka kirjoitetaan muodossa MyType.self. Näin purkajalle ilmoitetaan, mikä rakenne datasta pitää muodostaa.
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)Taulukoiden purkaminen
Kun haluatte purkaa JSON-taulukon, pyytäkää taulukkotyyppiä, kuten [Int].self tai [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, +))Sisäkkäisten objektien purkaminen
Sisäkkäiset JSON-objektit vastaavat sisäkkäisiä Codable-rakenteita. Purkaja käy puun läpi ja täyttää sen jokaisen tason puolestanne.
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)Purkamisvirheiden käsitteleminen
decode heittää virheen, kun data ei vastaa tyyppiä. Käsitelkää kutsu do/catch-rakenteessa, jotta virheellinen syöte voidaan käsitellä hallitusti.
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)
}keyNotFound-virheet
Yksi yleinen virhe on DecodingError.keyNotFound, joka syntyy pakollisen avaimen puuttuessa. Tunnistakaa virheen tyyppi erikseen, jotta voitte ilmoittaa täsmällisesti, mikä meni pieleen.
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)
}typeMismatch-virheet
Jos arvolla on väärä JSON-tyyppi — esimerkiksi merkkijono silloin, kun odotetaan Int-arvoa — purkaja heittää virheen 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)
}dataCorrupted-virheet
Virheellinen JSON-syntaksi aiheuttaa virheen DecodingError.dataCorrupted. Tämä tarkoittaa yleensä sitä, että tavut eivät ole lainkaan kelvollista JSONia.
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)
}Purkaminen optional-arvoihin
Jos ominaisuus on optional, puuttuva avain puretaan arvoksi nil ilman virhettä. Näin optional-kentät sietävät puuttuvaa dataa.
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")Purkajan uudelleenkäyttö
Kooderin tavoin määritettyä JSONDecoder-purkajaa voi käyttää uudelleen useille hyötykuormille. Säilyttäkää yksi ilmentymä ja purkakaa sillä erilaisia syötteitä.
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)
}Purkakaa, tarkastelkaa ja käyttäkää
Koko toimintoketju on seuraava: vastaanottakaa Data, purkakaa se tyypitetyksi arvoksi do/catch-rakenteessa ja käyttäkää sitten vahvasti tyypitettyä tulosta turvallisesti.
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)
}Pikatarkistus: JSONDecoder
Testatkaa tietonne purkamisesta.
Kertaus: Purkaminen JSONDecoderilla
Opitte muodostamaan Swift-arvoja uudelleen JSONista:
decode(MyType.self, from: data)tuottaa tyypitetyn arvon.- Taulukot, sisäkkäiset objektit ja optionalit puretaan automaattisesti.
decodeheittääDecodingError-tapauksia:keyNotFound,typeMismatch,dataCorruptedjavalueNotFound.- Käsitelkää kutsut
do/catch-rakenteessa, jotta virheellinen syöte voidaan käsitellä.
Opi Swift tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 122
- Oppitunnit
- 409
Usein kysytyt kysymykset
Onko oppitunti ”Dekoodaus JSONDecoderilla” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Swift Academy-oppimispolun 3 oppituntia, myös oppitunnin “Dekoodaus JSONDecoderilla”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Swift Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Dekoodaus JSONDecoderilla”?
Jäsennä JSON-data tyypitetyiksi Swift-arvoiksi. Harjoittelet Swift Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Swift Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Swift Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Dekoodaus JSONDecoderilla”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Swift Academy-oppitunnilla?
Kyllä. Jokainen Swift Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Codable-protokollan toteuttaminen
- Koodaus JSONEncoderilla
- Dekoodaus JSONDecoderilla
- Optionaalien ja sisäkkäisten tyyppien käsittely