2015-05-10 18 views
5

Sto cercando di prendere dati da un URL (file JSON) ottengo questo errore su queste linee:errore Swift JSON, non poteva lanciare valore di tipo '__NSArrayM' (0x507b58) per 'NSDictionary' (0x507d74)

var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as! NSDictionary 
if (err != nil) { 
    println("JSON Error \(err!.localizedDescription)") 
} 

errore dice

Discussione 6: segnale SIGABIRT - non potresti lanciare valore di tipo '__NSArrayM' (0x518b58) per 'NSDictionary' (0x518d74).

+4

Vai a json.org e studia la sintassi JSON. Ci vogliono solo 5-10 minuti per imparare. Quindi, butta fuori qualsiasi esempio da cui si estrae e in realtà scrivi il codice che corrisponde al JSON, comprendendo che un array JSON ('[]') esegue il mapping su un NSArray e un oggetto JSON ('{}') esegue il mapping a un NSDictionary. –

risposta

12

Qualunque sia l'aspetto dei dati del file JSON, l'oggetto di livello superiore è un array. Poiché hai superato .MutableContainers per l'argomento options:, la deserializzazione restituisce un array mutabile.

Si sono forza-casting l'accaduto a un NSDictionary:

as! NSDictionary 

Ma non si può farlo perché si tratta di un array, non un dizionario.

La cosa corretta da fare dipende interamente da ciò per cui stiamo scrivendo il codice.

  • Stiamo sempre deserializzando lo stesso JSON qui? Avrà sempre la stessa struttura?

Se non lo è, abbiamo bisogno di un approccio più dinamico. Ma se siamo, questo errore rende chiaro che si sta deserializzazione di un array, quindi cerchiamo di cambiare as! NSDictionary a:

as NSMutableArray 

Questo farà diverse cose.

Dal momento che stiamo prendendo entrambi gli oggetti mutabili, questo ci restituirà oggetti mutevoli (altrimenti non dovremmo leggerli come mutabili).

Leggeremo effettivamente il tipo corretto (un array contro un dizionario).

E rimuovendo lo !, torneremo un optional. La buona notizia è che questo significa che il nostro codice non si bloccherà solo perché abbiamo ottenuto JSON inaspettato.

+0

come dovrei cambiarlo? – solohane

+0

Sbarazzati di 'as! NSDictionary'. Smetti di abusare dell'operatore '!' In Swift. – nhgrif

Problemi correlati