Arbetar med JSON i Swift

JSON-dataformatet används ofta över den moderna webben och det är ett av de vanligaste sätten att överföra data. Många moderna API-er, särskilt RESTful-webbtjänster, stöder JSON-dataformatet.

I den här handledningen visar jag dig hur du ska arbeta med JSON-dataformatet i Swift-programmeringsspråket på iOS, tvOS, watchOS och OS X.

förutsättningar

Denna handledning kräver att du kör minst Xcode 7, som innehåller version 2 i Swift programmeringsspråket. Swift 2 har infört ett antal viktiga tillägg som vi ska använda i denna handledning, till exempel felhantering och vakt påstående.

1. Vad är JSON?

Som jag nämnde är JSON ett vanligt datformat som används för kommunikation mellan exempelvis kunder och servrar. Den är populär på grund av användbarheten på nästan vilken mobil plattform som iOS, Android, Windows Phone och webbläsare.

Följande kod är ett exempel på JSON-dataformatet. Detta är den kod som vi ska använda i den här handledningen.

"dataTitle": "JSON Tutorial!", "swiftVersion": 2.1 "användare": ["namn": "John", "ålder": 25, "namn": "Markera", "ålder" 29, "namn": "Sarah", "ålder": 22],

Som du kan se är JSON-dataformatet lätt att förstå. JSON är strukturerad med två insamlingstyper, ordböcker och arrays. Ordböcker innehåller ett eller flera av nyckelvärdespar och är inneslutna av lockiga axlar, . Arrayer innehåller en lista över beställda föremål och bifogas med kvadratfästen, []. Nästan varje programmeringsspråk definierar dessa samlingstyper, varför JSON stöds av nästan alla språk runt.

Nedan följer en lista över de stödda datatyperna i ett JSON-objekt:

  • Sträng
  • Nummer (heltal, float, dubbel, etc.)
  • Boolean
  • Array
  • Ordbok

En del av anledningen till att JSON är så populär är att det är lätt att läsa av människor och det kan också enkelt analyseras och serialiseras av maskiner. Parsing och serialisering är när maskinen tar in rådata och omvandlar det till ett objekt som kan användas av programmet.

2. Läsa JSON Data

Steg 1: Skapa lekplats

Avfyra Xcode och skapa en ny lekplats. Ge lekplatsen ett namn och set Plattform till iOS.

Steg 2: Lägg till JSON-data

Öppna Navigatör till vänster och expandera JSON lekplats. Högerklicka på Medel mapp och välj Ny fil från menyn.

Namnge filen data.json och fyll i filen med följande JSON.

"name": "mark", "ålder": 29, "namn": "Sarah", "ålder" : 22], "dataTitle": "JSON Tutorial!", "SwiftVersion": 2.1

Steg 3: Hämta data

Nu när du har en grundläggande förståelse för vad JSON-datformatet är, är det dags att börja arbeta med det i Swift. Ta bort innehållet på lekplatsen och lägg till följande tre rader av kod till den.

Importera UIKit låt url = NSBundle.mainBundle (). URLForResource ("Data", medExtension: "json") låt data = NSData (contentOfURL: url!)

Med den här koden får vi en referens till den JSON-fil som vi lagt till på lekplatsen för några minuter sedan och får dess innehåll som rådata. Observera att webbadressen vi skapar här är en lokal till filen på din dator. Det här kan vara webbadressen till en webbtjänst eller någon annan webbadress du behöver.

Det är också viktigt att förstå att de råa uppgifterna för ett JSON-objekt inte behöver samlas på detta sätt. Den enda väsentliga delen är den råa NSData objekt som kan komma från en URL som visas i exemplet, ett API-svar eller från en rad andra källor.

Steg 4: Analysera data

Nästa steg är att analysera och serialisera denna data till ett objekt vi kan använda. Lyckligtvis, på IOS och OS X, stiftelsen NSJSONSerialization klassen hanterar allt det svåra arbetet med att analysera och serialisera för dig. Lägg till följande kodbit till din lekplats.

gör let object = försök NSJSONSerialization.JSONObjectWithData (data !, alternativ: .AllowFragments) om låt dictionary = objekt som? [String: AnyObject] readJSONObject (ordbok) fånga // Handle Error

Vi bifogar all vår logik först i en göra bifångst uttalande, eftersom serialiseringen från JSON-data har potential att kasta ett fel. Därefter kallar vi JSONObjectWithData (_: alternativ :) metod för NSJSONSerialization klass, passerar i NSData objekt och några alternativ. Alternativen som kan skickas in definieras av NSJSONReadingOptions strukturera:

  • AllowFragments Detta möjliggör föremål inom den första eller översta nivån av JSON-data som inte är arrays eller ordböcker som ska läsas. I den JSON-data som används i denna handledning ingår detta både i dataTitle och swiftVersion värden.
  • MutableLeaves Med det här alternativet kan strängar läsas från JSON-data som automatiskt skapas som instanser av NSMutableString. Detta alternativ är mer relevant för mål-C-utveckling. I Swift kan du ignorera det här alternativet eftersom strängar är en inbyggd grundläggande datatyp och automatiskt kan ändras när de definieras med var nyckelord.
  • MutableContainers Detta gör det möjligt för arrays och ordböcker att läsas från JSON-data för att också vara mutable. Som med MutableLeaves alternativet, i Swift, med hjälp av var sökord när man matar matrisen / ordboken till en variabel gör den automatiskt muterbar.

Slutligen kontrollerar vi för att se om det seriella objektet är av den förväntade [String: AnyObject] skriv och, om så är fallet, ringa till readJSONObject (_ :) fungera. Låt oss ta en titt på readJSONObject (_ :) metod.

Steg 5: Arbeta med data

När de JSON-data du har samlat har analyserats och serialiserats kan du interagera med det precis som du skulle med någon annan ordlista. Lägg till följande funktion på din lekplats ovan de göra bifångst påstående.

func readJSONObject (objekt: [String: AnyObject]) guard let title = objekt ["dataTitle"] som? String, låt version = objekt ["swiftVersion"] som? Float, låt användare = objektera ["användare"] som? [[String: AnyObject]] else return _ = "Swift \ (version)" + titel för användare i användare guard let name = user ["name"] som? String, låt ålder = användare ["ålder"] som? Int else break switch ålder fall 22: _ = namn + "är \ (ålder) år gammal." fall 25: _ = namn + "är \ (ålder) år gammal." fall 29: _ = namn + "är \ (ålder) år gammal." standard: break

Som du kan se kan den serialiserade JSON-data interagera på exakt samma sätt som en vanlig ordbok eller array. Ovanstående readJSONObject (_ :) funktionen fungerar som ett exempel på hur du kan extrahera informationen från ett serialiserat JSON-objekt. Observera att jag inkluderade en växla uttalande i funktionen helt enkelt för att skilja strängarna i lekplatsens utgång.

När lekplatsen har slutfört din kod bör du se ett resultat i sidofältet som liknar följande.

Grattis. Du vet nu hur du hämtar JSON-data, serialiserar den och använder den som en vanlig ordbok i din Swift-kod. Som du kan se är processen mycket enkel tack vare NSJSONSerialization API, vilket gör det mesta av det hårda arbetet för oss.

3. Skriva JSON Data

Förutom att läsa JSON-data, som du får från en online-källa eller en lokal fil, är det också viktigt att veta hur man skapar egna JSON-data. Om det här ska sparas som en lokal fil eller, oftast, skickas till en webbtjänst, bearbetar den det lika enkelt och enkelt som att läsa JSON-data. Ta en titt på följande exempel.

låt validDictionary = ["numericalValue": 1, "stringValue": "JSON", "arrayValue": [0, 1, 2, 3, 4, 5]] låt invalidDictionary = ["date": NSDate ()] om NSJSONSerialization .isValidJSONObject (validDictionary) // True do let RawData = prova NSJSONSerialization.dataWithJSONObject (validDictionary, options: .PrettyPrinted) fånga // Handle Error om NSJSONSerialization.isValidJSONObject (invalidDictionary) // False // NSJSONSerialization. dataWithJSONObject (validDictionary, options: .PrettyPrinted) kommer att ge ett fel om det kallas

När du skapar din egen JSON-data från ett objekt är det bäst att först använda isValidJSONObject (_ :) metod för att kontrollera om objektet kan omvandlas till ett JSON-objekt.

Efter denna första kontroll, ringer du på dataWithJSONObject (_ :) metod som returnerar en NSData objekt om det är framgångsrikt. Eftersom vi redan har kontrollerat om objektet är giltigt, är felet fånga block här är inte lika viktigt som tidigare men kan fortfarande kallas på grund av ett internt API-fel när du skapar de råa data.

De PrettyPrinted Alternativet som används i det här exemplet är det enda alternativet som är tillgängligt att använda med den här metoden och, när det används, läggs helt enkelt till i mer whitespace till JSON-data så att det blir lättare att läsa.

// Med PrettyPrinted Alternativ: "namn": "John", "ålder": 25 // Utan PrettyPrinted Alternativ: "namn": "John", "ålder": 25

Den återvände NSData objekt kan sedan användas men du vill. Du kan spara den till en lokal fil eller skicka den till en webbtjänst till.

Slutsats

Du borde nu vara bekväm att jobba med JSON i Swift. Det är uppenbart att stjärnspelaren är NSJSONSerialization klass, med lite hjälp från några vakt och göra bifångst uttalanden. Som du kan se är det väldigt lätt att arbeta med JSON-data. När JSON-data analyseras och serialiseras kan du interagera med det precis som du skulle med något annat vanligt föremål.

Som alltid, var noga med att lämna dina kommentarer och feedback i kommentarerna nedan.