JSON Wars: Covable Unbox

Foto autor Julian Howard saidil Unsplash

Algselt avaldati Swift Postis.

Codable tekitas kõigis elevust, sest me kõik armastame JSON-i sõelumist ja on tore, kui see tööriist on osa tavalisest raamatukogust. Nüüd on aeg testida, kas see on piisavalt väärt, et olla meie lemmik.

Vaatame, kuidas Codable töötab rasketes tingimustes. Sõelume järgmise JSON-iga, kasutades Covablei, ja võrrelge seda siis populaarse Unbox / Wrap-i rakendusega.

{
  „PlaceName”: „Istanbul, Türgi”,
  “Lat”: 41.0049823,
  “Lon”: 28.7319958,
  “DateAdded”: “2018-05-25”,
  “Info”: “Istanbul on väga ajalooline linn.”
}

Soovime, et meie andmemudel näeks välja järgmine.

struct Koht: Covable {
  lase nimi: Keel
  lase koordineerida: Koordinaat
  lase dateAdded: kuupäev
  lase info: Keel?
}
struct Coordinate {
  laiuskraad: kümnendkoha täpsusega
  pikkuskraad: kümnendkoha täpsusega
}

Väljakutsed:

  • kohanimi ja nimi ei kattu. Peame kodeerimisvõtmeid näpistama.
  • Kaks eraldi klahvi lat ja lon muutuvad Koordinaatide objektiks. Vaja on kohandatud dekodeerimist.
  • Väljale dateAdded peame kasutama kuupäevavormingut AAAA-KK-pp.
  • Peame vea viskama, kui nime, koordinaadi ja kuupäeva lisamise väljad puuduvad, kuid teabeväli on valikuline.

Teostamine Codable abil

Rakendamine Unbox & Wrap abil

Kasutamine

Nende kasutamine on peaaegu sama. See on muidugi see, kui määratleme dekoodri ja kodeeri klassi atribuudina.

Kodeeritav:

lase koht = proovi Place.decoder.decode (Place.self, pärit: jsonData)
lase placeData = proovi Place.encoder.encode (koht)

Unbox / wrap

lase koht = proovi kohta (unboxer: Unboxer (andmed: jsonData))
lase placeData = proovi mähkida (asetada) andmeks

Võrdlus

  • Kodeeritav teostus on 47 rida, samas kui Unboxi teostus on selle näite korral 39 rida.
  • Covablei klahvid on alati tugevalt kirjutatud (CodingKeys), samas kui Unbox aktsepteerib ainult keelte klahve.
  • Omaduste dekodeerimise ajal järeldab Unbox tüübi, kuid Covable nõuab tüübi kasutamist parameetrina. Selle saab aga lubada ka Covable'is, kasutades lihtsat laiendit nagu KeyedDecodingContainer + TypeInference.
// kodeeritav:
proovige konteiner.decode (String. Self, forKey: .name)
// Unbox:
nimi = proovige unboxer.unbox (võti: "placeName")
  • Kodeeritav toetab ainult ühte kuupäeva kodeerimise / dekodeerimise strateegiat. Nii et kui meil oleks koos dateAddediga UNIX-i ajatempli atribuut, peaksime selle käsitsi teisendama kuupäevaobjektiks algatustes (dekooderist :) -meetodil.
  • Kodeeritaval on võtmete ümber palju lisafunktsioone, mis pole saadaval kaustas Unbox / Wrap. (Vt: JSON-i kasutamine kohandatud tüüpidega)
  • Unbox / Wrap on sõltuvus kolmandast isikust, samas kui Covable on osa standardsest teegist.

Alumine rida 🎖

Kuigi Codable nõuab enne täpsemat kasutamist põhjalikku uurimist ja seedimist, saate Unboxiga töötades mõne minutiga hakkama saada. Seerialiseerimiseks nõuab Unbox ainult algmeetodi rakendamist, mis määratleb kõik vasted.

Teisest küljest on Codable must maagia.

Enamikul juhtudest töötab see lihtsalt ilma igasuguste kohandamisteta. Ehkki edasijõudnute kasutamine võib mõnikord olla keeruline klahvide tugeva tipptaseme tõttu, on seda lihtne õppida. Kodeeritav on nagu Šveitsi armee nuga, nii et ma ei mõtle ühelegi juhtumile, kui te ei saa sellega hakkama.

Alustasin seda postitust, mõeldes, et Unbox on võrreldes edasijõudnute kasutamise jaoks hõlpsamini kasutatava Covableiga võrreldes palju lihtsam ja loetavam, kuid näidiskood näitab teisiti. Võib-olla on aeg eemalduda kõigist kolmanda osapoole JSON-i parsimisraamistikest ja sõlmida Codableiga rahu.

Hästi mängitud, Apple.

Täname, et lugesite! Palun andke mulle teada, mida arvate ja aidake sõna levitada.

Lisalugemine: Swift 4’s Covable, autor Alp Avanoğlu