Arbeider med JSON i Swift

JSON-dataformatet er mye brukt på tvers av det moderne webområdet, og det er en av de vanligste måtene å overføre data til. Mange moderne APIer, spesielt RESTful webtjenester, støtter JSON dataformatet.

I denne veiledningen vil jeg vise deg hvordan du arbeider med JSON-datformatet i Swift programmeringsspråket på iOS, tvOS, watchOS og OS X.

Forutsetninger

Denne opplæringen krever at du kjører minst Xcode 7, som inkluderer versjon 2 av Swift programmeringsspråket. Swift 2 har introdusert en rekke viktige tillegg som vi skal bruke i denne opplæringen, for eksempel feilhåndtering og vakt uttalelse.

1. Hva er JSON?

Som jeg nevnte, er JSON et ofte brukt datformat som brukes til kommunikasjon mellom for eksempel klienter og servere. Det er populært på grunn av det er brukervennlighet på nesten hvilken som helst mobil plattform som iOS, Android, Windows Phone og nettlesere.

Følgende utdrag er et eksempel på JSON-dataformatet. Dette er koden som vi skal bruke i denne opplæringen.

"dataTitle": "JSON Tutorial!", "swiftVersion": 2.1 "brukere": ["navn": "John", "alder": 25, "navn": "Mark", "alder" 29, "navn": "Sarah", "alder": 22],

Som du kan se, er JSON-dataformatet lett å forstå. JSON er strukturert ved hjelp av to samlingstyper, ordbøker og arrays. Ordbøker inneholder ett eller flere av nøkkelverdier og er omgitt av krøllete bånd, . Arrays inneholder en liste over bestilte varer og er vedlagt ved firkantede parenteser, []. Nesten alle programmeringsspråk definerer disse samlingstypene, og derfor støttes JSON av nesten alle språk rundt.

Følgende er en liste over de støttede datatyper i et JSON-objekt:

  • string
  • Nummer (heltall, flyte, dobbelt, etc.)
  • boolean
  • Array
  • Ordbok

En del av grunnen til at JSON er så populær, er fordi det er lett å lese av mennesker, og det kan også enkelt analyseres og serialiseres av maskiner. Parsing og serialisering er når maskinen tar inn rå data og gjør det til et objekt som kan brukes av programmet.

2. Lesing av JSON-data

Trinn 1: Lag lekeplass

Brann opp Xcode og opprett en ny lekeplass. Gi lekeplassen et navn og sett Plattform til iOS.

Trinn 2: Legg til JSON-data

Åpne Navigator til venstre og utvide JSON lekeplass. Høyreklikk på ressurser mappe og velg Ny fil fra menyen.

Gi filen navnet data.json og fyll filen med følgende JSON.

"navn": "mark", "alder": 29, "navn": "Sarah", "alder" : 22], "dataTitle": "JSON Tutorial!", "SwiftVersion": 2.1

Trinn 3: Få data

Nå som du har en grunnleggende forståelse av hva JSON dataformatet er, er det på tide å begynne å jobbe med det i Swift. Fjern innholdet på lekeplassen og legg til de følgende tre kodelinjene.

Import UIKit la url = NSBundle.mainBundle (). URLForResource ("Data", medExtension: "json") la data = NSData (contentOfURL: url!)

Med denne koden får vi en referanse til JSON-filen vi lagt til på lekeplassen for noen få minutter siden, og får innholdet som rådata. Vær oppmerksom på at nettadressen vi lager her er en lokal til filen på datamaskinen din. Dette kan være nettadressen til en webtjeneste eller en annen nettadresse du måtte trenge.

Det er også viktig å forstå at rådataene til et JSON-objekt ikke må samles på denne måten. Den eneste viktige delen er rå NSData objekt, som kan komme fra en nettadresse som vist i eksempelet, et API-svar eller fra en rekke andre kilder.

Trinn 4: Parsing Data

Det neste trinnet er å analysere og serialisere disse dataene i en gjenstand vi kan bruke. Heldigvis, på IOS og OS X, stiftelsen NSJSONSerialization klassen håndterer alt det harde arbeidet med å parsing og serialisering for deg. Legg til følgende kodestykke til lekeplassen din.

gjør let object = prøv NSJSONSerialization.JSONObjectWithData (data !, alternativer: .AllowFragments) hvis la ordbok = objekt som? [String: AnyObject] readJSONObject (ordbok) fangst // Håndteringsfeil

Vi vedlegger først all vår logikk i en gjør-fangst setning, fordi serialisering fra JSON-data har potensial til å kaste en feil. Deretter kaller vi JSONObjectWithData (_: alternativer :) metode av NSJSONSerialization klasse, passerer i NSData objekt og noen alternativer. Alternativene som kan sendes inn, er definert av NSJSONReadingOptions struktur:

  • AllowFragments Dette tillater gjenstander innenfor det første eller øverste nivået av JSON-dataene som ikke er arrays eller ordbøker som skal leses. I JSON-dataene som brukes i denne opplæringen, inkluderer dette både dataTitle og swiftVersion verdier.
  • MutableLeaves Dette alternativet tillater at strenger leses fra JSON-dataene som automatisk skal opprettes som forekomster av NSMutableString. Dette alternativet er mer relevant for mål-C-utvikling. I Swift kan du ignorere dette alternativet fordi strenger er en innebygd grunnleggende datatype og automatisk omdannes når den er definert med Var søkeord.
  • MutableContainers Dette gjør det mulig for arrays og ordbøker å bli lest fra JSON-dataene for å også være mutable. Som med MutableLeaves alternativ, i Swift, ved hjelp av Var søkeord når tilordnet array / ordbok til en variabel gjør det automatisk mutable.

Til slutt ser vi om det serielle objektet er av den forventede [String: AnyObject] skriv inn og, hvis så, ring på readJSONObject (_ :) funksjon. La oss ta en titt på readJSONObject (_ :) metode.

Trinn 5: Arbeide med data

Når JSON-dataene du har samlet, har blitt analysert og serialisert, kan du samhandle med det akkurat som du ville med noen annen ordliste. Legg til følgende funksjon på lekeplassen din ovenfor de gjør-fangst uttalelse.

func readJSONObject (objekt: [String: AnyObject]) guard la title = objekt ["dataTitle"] som? String, la versjon = objekt ["swiftVersion"] som? Float, la brukere = objekt [[brukere]] som? [[String: AnyObject]] else return _ = "Swift \ (versjon)" + tittel for bruker i brukere guard let navn = bruker ["navn"] som? String, la alder = bruker ["alder"] som? Int else break switch alder case 22: _ = name + "er \ (alder) år gammel." tilfelle 25: _ = navn + "er \ (alder) år gammel." sak 29: _ = navn + "er \ (alder) år gammel." standard: pause

Som du kan se, kan de serialiserte JSON-dataene samhandles med på samme måte som en vanlig ordbok eller array. Ovennevnte readJSONObject (_ :) funksjonen fungerer som et eksempel på hvordan du kan trekke ut informasjonen fra et serialisert JSON objekt. Legg merke til at jeg inkluderte en bytte om setning i funksjonen bare for å skille strenger i lekeplassens utgang.

Når lekeplassen er ferdig med å utføre koden, bør du se et resultat i sidefeltet som ligner på følgende.

Gratulerer. Du vet nå hvordan du henter JSON-data, serialiserer den, og bruker den som en vanlig ordbok i Swift-koden. Som du kan se, er prosessen veldig enkel takket være NSJSONSerialization API, som gjør det meste av det harde arbeidet for oss.

3. Skrive JSON Data

I tillegg til å lese JSON-data, som du mottar fra en online kilde eller en lokal fil, er det også viktig å vite hvordan du lager din egen JSON-data. Hvorvidt dette skal lagres som en lokal fil eller, oftest, sendes til en webtjeneste, prosessen er det like enkelt og enkelt som å lese JSON-data. Ta en titt på følgende eksempel.

la validDictionary = ["numericalValue": 1, "stringValue": "JSON", "arrayValue": [0, 1, 2, 3, 4, 5]] la invalidDictionary = ["date": NSDate ()] hvis NSJSONSerialization .isValidJSONObject (validDictionary) // True do let rawData = prøv NSJSONSerialization.dataWithJSONObject (validDictionary, alternativer: .PrettyPrinted) fangst // Handle Error hvis NSJSONSerialization.isValidJSONObject (invalidDictionary) // False // NSJSONSerialization. dataWithJSONObject (validDictionary, alternativer: .PrettyPrinted) vil produsere en feil hvis det kalles

Når du lager dine egne JSON-data fra et objekt, er det best å først bruke isValidJSONObject (_ :) metode for å sjekke om objektet kan konverteres til et JSON objekt.

Etter denne innledende sjekken ringer du til dataWithJSONObject (_ :) metode, som returnerer en NSData objekt hvis det lykkes. Fordi vi allerede har sjekket om objektet er gyldig, er feilen eller ikke å fange blokkering her er ikke så viktig som før, men kan fortsatt kalles på grunn av en intern API-feil når du lager de rå dataene.

De PrettyPrinted alternativet som brukes i dette eksemplet, er det eneste alternativet som er tilgjengelig for bruk med denne metoden, og legger til, når det brukes, i mer hvitt plass til JSON-dataene for å gjøre det lettere å lese.

// Med PrettyPrinted Option: "navn": "John", "alder": 25 // Uten PrettyPrinted Option: "navn": "John", "alder": 25

Den returnerte NSData objekt kan da brukes uansett. Du kan lagre den til en lokal fil eller sende den til en webtjeneste til.

Konklusjon

Du bør nå være komfortabel med å jobbe med JSON i Swift. Det er klart at stjernespilleren er NSJSONSerialization klasse, med litt hjelp fra noen få vakt og gjør-fangst uttalelser. Som du kan se, er det veldig enkelt å jobbe med JSON-data. Når JSON-dataene er analysert og serialisert, kan du samhandle med det akkurat som du ville med noe annet vanlig objekt.

Som alltid, vær sikker på å legge igjen dine kommentarer og tilbakemeldinger i kommentarene nedenfor.