Werken met JSON in Swift

Het JSON-gegevensformaat wordt op grote schaal gebruikt in het moderne web en het is een van de meest gebruikelijke manieren om gegevens over te zetten. Veel moderne API's, met name RESTful-webservices, ondersteunen het JSON-gegevensformaat.

In deze zelfstudie laat ik je zien hoe je kunt werken met het JSON-gegevensformaat in de programmeertaal van Swift op iOS, tvOS, watchOS en OS X.

voorwaarden

Deze tutorial vereist dat u ten minste Xcode 7 gebruikt, waaronder versie 2 van de Swift-programmeertaal. Swift 2 heeft een aantal belangrijke toevoegingen geïntroduceerd die we in deze zelfstudie zullen gebruiken, zoals foutafhandeling en de bewaker uitspraak.

1. Wat is JSON?

Zoals ik al zei, is JSON een veelgebruikt gegevensformaat dat wordt gebruikt voor communicatie tussen bijvoorbeeld clients en servers. Het is populair vanwege zijn bruikbaarheid op vrijwel elk mobiel platform zoals iOS, Android, Windows Phone en webbrowsers.

Het volgende fragment is een voorbeeld van het JSON-gegevensformaat. Dit is het fragment dat we in deze zelfstudie zullen gebruiken.

"dataTitle": "JSON-handleiding!", "swiftVersion": 2.1 "gebruikers": ["name": "John", "age": 25, "name": "Mark", "age": 29, "name": "Sarah", "age": 22],

Zoals u kunt zien, is het JSON-gegevensformaat gemakkelijk te begrijpen. JSON is gestructureerd met behulp van twee soorten verzamelingen, woordenboeken en arrays. Woordenboeken bevatten een of meer sleutel / waarde-paren en zijn ingesloten door accolades, . Arrays bevatten een lijst met bestelde items en worden ingesloten door vierkante haakjes, []. Vrijwel elke programmeertaal definieert deze collectietypen, daarom wordt JSON door bijna elke taal in de omgeving ondersteund.

Het volgende is een lijst met de ondersteunde gegevenstypen in een JSON-object:

  • Draad
  • Getal (integer, float, double, etc.)
  • Boolean
  • reeks
  • Woordenboek

Een van de redenen waarom JSON zo populair is, is omdat het gemakkelijk te lezen is door mensen en het ook gemakkelijk kan worden geparseerd en geserialiseerd door machines. Parsing en serialiseren is wanneer de machine onbewerkte gegevens inneemt en verandert in een object dat door de toepassing kan worden gebruikt.

2. JSON-gegevens lezen

Stap 1: Speelplaats maken

Start Xcode op en maak een nieuwe speeltuin. Geef de speeltuin een naam en een set Platform naar iOS.

Stap 2: voeg JSON-gegevens toe

Open de Navigator aan de linkerkant en vouw de JSON speelplaats. Klik met de rechtermuisknop op de Middelen map en selecteer Nieuw bestand van het menu.

Geef het bestand een naam data.json en vul het bestand met de volgende JSON.

"users": ["name": "John", "age": 25, "name": "Mark", "age": 29, "name": "Sarah", "age" : 22], "dataTitle": "JSON Tutorial!", "SwiftVersion": 2.1

Stap 3: gegevens ophalen

Nu je een basiskennis hebt van wat het JSON-gegevensformaat is, is het tijd om ermee in Swift te gaan werken. Verwijder de inhoud van de speeltuin en voeg de volgende drie regels code toe.

import UIKit laat url = NSBundle.mainBundle (). URLForResource ("Data", met Uitbreiding: "json") laat data = NSData (contentsOfURL: url!)

Met deze code krijgen we een verwijzing naar het JSON-bestand dat we een paar ogenblikken geleden aan de speeltuin hebben toegevoegd en krijgen we de inhoud als onbewerkte gegevens. Houd er rekening mee dat de URL die we hier maken, een lokale is voor het bestand op uw computer. Dit kan de URL zijn van een webservice of een andere URL die u mogelijk nodig heeft.

Het is ook belangrijk om te begrijpen dat de onbewerkte gegevens van een JSON-object niet op deze manier hoeven te worden verzameld. Het enige essentiële deel is het rauwe NSData object, dat afkomstig kan zijn van een URL zoals in het voorbeeld wordt getoond, een API-antwoord of een reeks andere bronnen.

Stap 4: gegevens parseren

De volgende stap is om deze gegevens te ontleden en te serialiseren in een object dat we kunnen gebruiken. Gelukkig, op iOS en OS X, de Stichting NSJSONSerialization class verwerkt al het harde werk van parsing en serializing voor u. Voeg het volgende codefragment toe aan uw speeltuin.

do let object = try NSJSONSerialization.JSONObjectWithData (data !, options: .AllowFragments) if let dictionary = object as? [String: AnyObject] readJSONObject (dictionary) catch // Handle Error

We voegen eerst al onze logica in a doe-vangst verklaring, omdat de serialisatie van JSON-gegevens de potentie heeft om een ​​fout te genereren. Vervolgens noemen we de JSONObjectWithData (_: options :) methode van de NSJSONSerialization klas, passeren in de NSData object en enkele opties. De opties die kunnen worden doorgegeven, worden gedefinieerd door de NSJSONReadingOptions structuur:

  • AllowFragments Hiermee kunnen objecten binnen het eerste of hoogste niveau van de JSON-gegevens worden gelezen die geen arrays of woordenboeken zijn. In de JSON-gegevens die in deze zelfstudie worden gebruikt, omvat dit zowel de dataTitle en swiftVersion waarden.
  • MutableLeaves Met deze optie kunnen strings die worden gelezen uit de JSON-gegevens automatisch worden gemaakt als exemplaren van NSMutableString. Deze optie is relevanter voor de ontwikkeling van Objective-C. In Swift kunt u deze optie negeren omdat tekenreeksen een ingebouwd basistype zijn en automatisch kunnen worden gewijzigd wanneer ze worden gedefinieerd met de var trefwoord.
  • MutableContainers Dit maakt het mogelijk dat arrays en woordenboeken die uit de JSON-gegevens worden gelezen, ook kunnen worden gewijzigd. Zoals met de MutableLeaves optie, in Snel, met behulp van de var sleutelwoord bij het toewijzen van de array / dictionary aan een variabele maakt het automatisch veranderbaar.

Ten slotte controleren we of het geserialiseerde object van de verwachte is [String: AnyObject] typ en, zo ja, bel de readJSONObject (_ :) functie. Laten we eens kijken naar de readJSONObject (_ :) methode.

Stap 5: Werken met gegevens

Nadat de JSON-gegevens die u hebt verzameld, zijn geparseerd en geserialiseerd, kunt u ermee werken op dezelfde manier als met elk ander woordenboek. Voeg de volgende functie toe aan uw speeltuin bovenstaande de doe-vangst uitspraak.

func readJSONObject (object: [String: AnyObject]) guard let title = object ["dataTitle"] as? String, let version = object ["swiftVersion"] als? Float, laat users = object ["users"] als objecteren? [[String: AnyObject]] else return _ = "Swift \ (versie)" + title voor gebruiker in gebruikers guard let name = user ["name"] as? String, laat age = user ["age"] zoals? Int else break schakelt van leeftijd case 22: _ = naam + "is \ (leeftijd) jaar oud." geval 25: _ = naam + "is \ (leeftijd) jaar oud." geval 29: _ = naam + "is \ (leeftijd) jaar oud." standaard: pauze

Zoals u kunt zien, kunnen de geserialiseerde JSON-gegevens op exact dezelfde manier worden gebruikt als een gewone woordenlijst of matrix. Bovenstaande readJSONObject (_ :) function dient als een voorbeeld van hoe u de informatie uit een geserialiseerd JSON-object kunt extraheren. Merk op dat ik een a schakelaar verklaring in de functie om de tekenreeksen in de uitvoer van de speelplaats te scheiden.

Zodra de speeltuin klaar is met het uitvoeren van uw code, ziet u een resultaat in de zijbalk dat lijkt op het volgende.

Gefeliciteerd. U weet nu hoe u JSON-gegevens moet ophalen, het kunt serialiseren en het als een normaal woordenboek in uw Swift-code kunt gebruiken. Zoals u kunt zien, is het proces heel eenvoudig dankzij de NSJSONSerialization API, die het grootste deel van het harde werk voor ons doet.

3. JSON-gegevens schrijven

Naast het lezen van JSON-gegevens, die u ontvangt van een online bron of een lokaal bestand, is het ook belangrijk om te weten hoe u uw eigen JSON-gegevens kunt maken. Of dit moet worden opgeslagen als een lokaal bestand of, meestal, om naar een webservice te worden verzonden, het proces is net zo eenvoudig en eenvoudig als het lezen van JSON-gegevens. Bekijk het volgende voorbeeld.

laat validDictionary = ["numericalValue": 1, "stringValue": "JSON", "arrayValue": [0, 1, 2, 3, 4, 5]] laat invalidDictionary = ["date": NSDate ()] als NSJSONSerialization .isValidJSONObject (validDictionary) // True do let rawData = try NSJSONSerialization.dataWithJSONObject (validDictionary, options: .PrettyPrinted) catch // Handle Error if NSJSONSerialization.isValidJSONObject (invalidDictionary) // False // NSJSONSerialization. dataWithJSONObject (validDictionary, options: .PrettyPrinted) geeft een foutmelding als called

Wanneer u uw eigen JSON-gegevens van een object maakt, is het het beste om eerst de isValidJSONObject (_ :) methode om te controleren of het object kan worden omgezet in een JSON-object.

Na deze eerste controle belt u de dataWithJSONObject (_ :) methode, die een retourneert NSData object indien succesvol. Omdat we al hebben gecontroleerd of het object wel of niet geldig is, de fout vangst blokkeren is hier niet zo belangrijk als voorheen maar kan nog steeds worden aangeroepen vanwege een interne API-fout bij het maken van de onbewerkte gegevens.

De PrettyPrinted De optie die in dit voorbeeld wordt gebruikt, is de enige optie die beschikbaar is voor gebruik met deze methode en voegt bij gebruik eenvoudigweg meer witruimte toe aan de JSON-gegevens om het lezen te vergemakkelijken.

// Met PrettyPrinted Option: "name": "John", "age": 25 // Without PrettyPrinted Option: "name": "John", "age": 25

De teruggekeerden NSData object kan dan worden gebruikt zoals je wilt. Je zou het in een lokaal bestand kunnen opslaan of het naar een webservice kunnen sturen.

Conclusie

Je zou nu comfortabel moeten werken met JSON in Swift. Het is duidelijk dat de sterspeler de NSJSONSerialization klas, met een beetje hulp van een paar bewaker en doe-vangst statements. Zoals u kunt zien, is het werken met JSON-gegevens heel eenvoudig. Zodra de JSON-gegevens zijn geparseerd en geserialiseerd, kunt u ermee werken op dezelfde manier als met elk ander normaal object.

Laat zoals altijd uw opmerkingen en feedback achter in de opmerkingen hieronder.