Swift, NSJSONSerialization et NSError
Le problème est lorsqu'il existe des données incomplètes NSJSONSerialization.JSONObjectWithData
est crash d'une application donnant unexpectedly found nil while unwrapping an Optional value
d'erreur au lieu de nous en informer en utilisant NSError variable. Si nous sommes incapables de prévenir l'accident.
Vous pouvez trouver le code que nous utilisons ci-dessous
var error:NSError? = nil
let dataToUse = NSJSONSerialization.JSONObjectWithData(receivedData, options: NSJSONReadingOptions.AllowFragments, error:&error) as NSDictionary
if error != nil { println( "There was an error in NSJSONSerialization") }
Jusqu'à maintenant, nous sommes incapables de trouver un travail autour de.
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous lancez le résultat au format JSON désérialisation avant
vérifier qu'une erreur. Si les données JSON n'est pas valide (par exemple, incomplets) alors
retourne
nil
eten panne.
Ici est une version qui vérifie les conditions d'erreur correctement:
Remarques:
variable d'erreur.
Le JSON de lecture option
.AllowFragments
ne sont pas utiles ici. Le réglage de cette optionpermet seulement que les objets de plus haut niveau qui ne sont pas une instance de
NSArray
ouNSDictionary
, par exempleVous pouvez aussi le faire en une seule ligne, avec un en fonte
as?
:L'inconvénient est que, dans le
else
cas, vous ne pouvez pas distinguer si la lecture deles données JSON a échoué ou si le JSON ne représentent pas un dictionnaire.
Pour une mise à jour de Swift 3, voir LightningStryk réponse.
!
alors vous avez le même problème qu'avec l'forcé castas NSDictionary
: Il va se planter si le résultat est nul.Mis à jour pour Swift 3
Swift 2
Swift 3:
Ici est une Swift 2 extension que vous pouvez utiliser pour deserialise seulement un NSDictionary:
Désolé je n'étais pas sûr de savoir comment faire un garde-retour afin d'éviter la création de la temporaire de "d".
Swift 3 NSJSONSerialization de l'échantillon (lire json à partir d'un fichier):
Utilisation
Résultat (journal capture d'écran)