web-dev-qa-db-fra.com

Rapide. Comment puis-je traiter les valeurs NULL dans les fichiers JSON?

Je lis json à partir d'une URL et, encore une fois (j'avais le même problème avec ObjectiveC), les valeurs plantaient mon application. Je n'ai aucun problème avec Strings and Numbers. Je peux println (valeur) mais quand j'assigne la valeur dans un UILabel, il se bloque.

J'utilise cette méthode pour lire le JSON:

func jsonFromURL(jsonURL: String) -> Dictionary<String, AnyObject> {
    var jsonNSURL: NSURL = NSURL(string: jsonURL)
    let jsonSource: NSData = NSData(contentsOfURL: jsonNSURL)
    var json = NSJSONSerialization.JSONObjectWithData(jsonSource, options:NSJSONReadingOptions.MutableContainers, error: nil) as Dictionary<String, AnyObject>
    return json
}

... et ce code pour assigner des valeurs dans un UILabel à l'intérieur d'une cellule personnalisée

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell? {

    var regularTextCell:celda = celda(style: UITableViewCellStyle.Default, reuseIdentifier: "cell")
    var cell:celda = NSBundle.mainBundle().loadNibNamed("celda", owner: self, options: nil)[0] as celda

    cell.name.text = myJson["list"]![indexPath.row]!["name"] as String
    cell.id.text = "id: " + String(myJson["list"]![indexPath.row]!["id"] as Int)

    // THIS line crash because some values of adress are <null>
    cell.address.text = myJson["list"]![indexPath.row]!["address"] as String

    return cell

}

Vous pouvez voir un exemple du code JSON à l’adresse: https://dl.dropboxusercontent.com/u/787784/example.json

Merci!

13
Francis Vega

Vous obtiendrez une exception à la syntaxe telle que object as String si object n'est pas une String. Vous pouvez éviter cette exception en utilisant object as? String, ce qui peut entraîner l'attribution d'une nil à votre text.

Dans votre cas spécifique, vous pouvez utiliser:

cell.address.text = (myJson["list"]![indexPath.row]!["address"] as? String) ?? "default"

où j'ai remplacé votre as par as? et exploité l'opérateur __-coalescing ??.

17
GoZoner

J'ai trouvé cette solution dans le didacticiel Swift en ligne. C'est une très bonne solution pour gérer la valeur nulle dans Swift. 

C'est le concept: 

 let finalVariable = possiblyNilVariable ?? "Definitely Not Nil Variable"

En exemple de tutoriel: 

  let thumbnailURL = result["artworkUrl60"] as? String ?? ""

Voici le lien pour le tutoriel: http://jamesonquave.com/blog/developing-ios-8-apps-using-Swift-interaction-with-multiple-views/

9
Marijan V.

Vous pouvez modifier la ligne incriminée en:

if let address = myJson["list"]![indexPath.row]!["address"] as? String {
  cell.address.text = address
}
else {
  cell.address.text = ""
}

L'opérateur as? convertira la valeur de la même manière que as, mais si la conversion échoue, il affectera plutôt nil.

La syntaxe if let … combine cela avec une vérification et lorsque le casting échoue (et que nil est renvoyé), le bloc else s'exécute à la place.

6
Jiaaro

Si tu utilises:

Vous pourrez aller comme ça:

let yourJSON = JSON.fromURL("https://dl.dropboxusercontent.com/u/787784/example.json")
for (i, node) in yourJSON["list"] {
    let isnull = node["address"].isNull
    println("//[\"list\"][\(i)]:\t\(isnull)")
}

//["list"][0]:  false
//["list"][1]:  false
//["list"][2]:  true
//["list"][3]:  false
//["list"][4]:  false
//["list"][5]:  true
//["list"][6]:  false
//["list"][7]:  false
//["list"][8]:  false
//["list"][9]:  false
//["list"][10]: false
//["list"][11]: false
//["list"][12]: true
//["list"][13]: false
//["list"][14]: false
//["list"][15]: false
//["list"][16]: false
//["list"][17]: false
//["list"][18]: false
//["list"][19]: false

Aucun ? ou ! requis et il ne se bloque pas sur des nœuds inexistants.

1
dankogai