2014-06-06 13 views
14

Sto utilizzando NSJSONSerialization per analizzare JSON in un'applicazione Swift. Tuttavia, il dizionario restituito è costituito da una struttura complessa e profondamente annidata, che rende poco pratico avere dichiarazioni di tipo molto lunghe (ad esempio Dictionary<String, Array<Dictionary<String, ....>>).Come faccio a manipolare dizionari nidificati in Swift, ad es. Dati JSON?

C'è un buon modo di lavorare con una tale struttura in Swift, dove la struttura della collezione è molto complicata e i suoi tipi non sono noti fino al runtime?

risposta

12

Basta prendere un riferimento ai dati JSON come NSDictionary:

var dict: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary 

allora si può fare riferimento utilizzando indici:

var myValue: NSString = dict["level1"]["level2"] 
+1

Grazie! Usare NSDictionary aiuta direttamente. Tuttavia, non penso che implementi la sottoscrizione: dovevo chiamare 'objectForKey'. – Bill

+1

Sto incontrando lo stesso. Devo chiamare objectForKey sugli oggetti interni per avere accesso ad essi. Non farlo sembra non solo porre un problema, ma si blocca anche Xcode 6 ... – tibbon

+0

Questo non funziona per me. Ho 'var dict: NSDictionary = NSDictionary (contentsOfFile:" some/path "); var deepValue = conjugationTable ["level1"] ["level2"] ["level3"] ' E il compilatore si lamenta che' Impossibile trovare un sovraccarico per 'subscript' che accetta gli argomenti forniti. ' – NRitH

5

myDictionary["accounts"] potrebbe essere un optional. Prova: myDictionary["accounts"]?["active"]?

4

In Obj-C potremmo scrivere,

cityName = myDictionary[@"photos"][@"region"][@"city"]

Come molti qui hanno scoperto, quanto sopra non si applica a Swift, almeno non ha per me.

Ecco come si esegue questa operazione a Swift per l'accesso ai tre indici in un NSDictionary per una stringa,

let cityName = ((myDictionary!["photos"] as NSDictionary)["region"]! as NSDictionary)["city"]! as String`

spero che nel prossimo aggiornamento a Swift tutto questo può essere ridotto a quello che avevamo in Obj-C.

+0

Sarebbe molto più semplice se il suo cast fosse 'NSDictionary' e usasse' valueForKeyPath' come '(jsonResponse as NSDictionary) .valueForKeyPath (" geometry.location.lat ") as? Int'. Ma si è anche imbattuto in un altro modo per ottenere dati nidificati dal dizionario. +1 – GoodSp33d

+0

Ho incontrato lo stesso problema. È stato reso più facile? Sto cercando un modo automatico per analizzare e tipografare completamente un intero dizionario annidato/array mix json. –

Problemi correlati