Swift Academy · Oppitunti

Dekoodaus JSONDecoderilla

Jäsennä JSON-data tyypitetyiksi Swift-arvoiksi.

Oppitunti 3/413 vaihetta

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.
  • decode heittää DecodingError-tapauksia: keyNotFound, typeMismatch, dataCorrupted ja valueNotFound.
  • Käsitelkää kutsut do/catch-rakenteessa, jotta virheellinen syöte voidaan käsitellä.
Aloita maksutta

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

  1. Codable-protokollan toteuttaminen
  2. Koodaus JSONEncoderilla
  3. Dekoodaus JSONDecoderilla
  4. Optionaalien ja sisäkkäisten tyyppien käsittely
← Takaisin: Swift Academy