JSON Wars: Covered Unbox

Foto: Džūlians Hovards vietnē Unsplash

Sākotnēji publicēts vietnē Swift Post.

Codable visus satraukti, jo mums visiem patīk JSON parsēšana, un ir patīkami, ka šis rīks ir daļa no standarta bibliotēkas. Tagad ir pienācis laiks pārbaudīt, vai tas ir pietiekami cienīgs, lai būtu mūsu iecienītākais.

Apskatīsim, kā Codable darbojas nelīdzenos apstākļos. Mēs analizēsim šo JSON, izmantojot Covable, un pēc tam salīdzināsim to ar populāro Unbox / Wrap ieviešanu.

{
  “PlaceName”: “Stambula, Turcija”,
  “Lat”: 41.0049823,
  “Lon”: 28.7319958,
  “DateAdded”: “2018-05-25”,
  “Info”: “Stambula ir ļoti vēsturiska pilsēta.”
}

Mēs vēlamies, lai mūsu datu modelis izskatās šādi.

struct Vieta: Codega {
  let nosaukums: stīga
  ļaujiet koordinēt: Koordinēt
  let dateAdded: Datums
  let info: stīga?
}
struct Coordinate {
  let platums: decimāldaļa
  let garums: decimāldaļa
}

Izaicinājumi:

  • vietas nosaukums un vārds nesakrīt. Mums ir jāpielāgo kodēšanas atslēgas.
  • Divas atsevišķas atslēgas lat un lon kļūst par koordinātu objektu. Nepieciešama pielāgota dekodēšana.
  • Laukā dateAdded jāizmanto datuma formāts GGGG-mm-dd.
  • Mums jānoraida kļūda, ja trūkst nosaukuma, koordinātas un datuma pievienošanas, bet informācijas lauks nav obligāts.

Īstenošana, izmantojot Covered

Ieviešana, izmantojot Unbox & Wrap

Lietošana

To izmantošana ir gandrīz vienāda. Tas ir, protams, ja dekodētāju un kodētāju mēs definējam kā klases īpašumu.

Codega:

let place = izmēģināt Place.decoder.decode (Place.self, no: jsonData)
let placeData = izmēģiniet Place.encoder.encode (vieta)

Unbox / Wrap:

let place = izmēģināt vietu (unboxer: Unboxer (data: jsonData))
let placeData = mēģiniet ietīt (ievietot) kā datus

Salīdzinājums

  • Pārkodējama ieviešana ir 47 līnijas, savukārt šajā piemērā Unbox ieviešana ir 39 līnijas.
  • Atslēgas kodējamā atslēgā vienmēr tiek stingri ierakstītas (CodingKeys), kamēr Atzīmēt tikai atslēgas.
  • Atšifrējot rekvizītus, Unbox secina tipu, bet Covable pieprasa veidu kā parametru. Tomēr to var iespējot arī Codable, izmantojot arī vienkāršu paplašinājumu, piemēram, KeyedDecodingContainer + TypeInference.
// iekodējams:
izmēģiniet container.decode (virkne. Self, forKey: .name)
// Atņemt:
name = mēģiniet unboxer.unbox (atslēga: "placeName")
  • Kodējams atbalsta tikai vienu datuma kodēšanas / dekodēšanas stratēģiju. Tātad, ja mums būtu UNIX laika spiedoga īpašums kopā ar dateAdded, mums tas manuāli jāpārveido datuma objektā inicializācijā (no dekodētāja :) metodes.
  • Codable ir daudz uzlaboto funkciju ap taustiņiem, kuras nav pieejamas mapē Unbox / Wrap. (Skatiet: JSON izmantošana ar pielāgotajiem veidiem)
  • Unbox / Wrap ir trešās puses atkarība, savukārt Codable ir standarta bibliotēkas sastāvdaļa.

Grunts līnija 🎖

Lai gan Covable prasa padziļinātu izpēti un sagremošanu pirms uzlabotas lietošanas, jūs varat sasniegt zemes gaitu, izmantojot Unbox dažu minūšu laikā. Lai veiktu serializēšanu, Unbox nepieciešams tikai ieviest init metodi, kas definē visas kartēšanas.

No otras puses, Covable ir melnā maģija.

Lielākajā daļā gadījumu tas vienkārši darbojas bez pielāgošanas. Lai arī uzlabota lietošana dažreiz var būt sarežģīta, jo taustiņi ir stipri drukāti, to ir viegli iemācīties. Kodējams ir kā Šveices armijas nazis, tāpēc es nevaru iedomāties nevienu gadījumu, kad jūs ar to netiktu galā.

Es sāku šo ziņu, domājot, ka Unbox ir daudz vienkāršāka un lasāmāka, salīdzinot ar Codable progresīvai lietošanai, bet parauga kods norāda citādi. Varētu būt laiks attālināties no visiem trešo pušu JSON parsēšanas ietvariem un panākt mieru ar Codable.

Labi spēlēts, Apple.

Paldies par lasīšanu Lūdzu, dariet man zināmu, ko domājat, un palīdziet šo vārdu izplatīt.

Turpmāks lasījums: Swift 4’s Covable by Alp Avanoğlu