web-dev-qa-db-fra.com

Comment gérer les valeurs NULL JSON dans Swift

Je joue avec Json depuis deux jours et je fais face à beaucoup de problèmes curieux. Grâce au débordement de pile, cela m'aide. c'est la clé sélectionnée par json qui a le type de valeur String Type. 

 "featured":"1"

ou

"featured": null,

j'ai beaucoup essayé de gérer ça mais j'ai échoué

step 1)

 if dict.objectForKey("featured") as? String != nil {
    featured = dict.objectForKey("featured") as? String
    }

étape 2)

    let null = NSNull()
    if dict.objectForKey("featured") as? String != null {
    featured = dict.objectForKey("featured") as? String
    }

étape 3)

    if dict.objectForKey("featured") as? String != "" {
    featured = dict.objectForKey("featured") as? String
    }

mais malheureusement, la solution ne peut pas être trouvée, votre réponse sera appréciée. 

13
Ayaz Akbar

Essaye ça

func nullToNil(value : AnyObject?) -> AnyObject? {
    if value is NSNull {
        return nil
    } else {
        return value
    }
}

object.feature = nullToNil(dict["feature"])

Ici, vous pouvez utiliser cette méthode, qui convertira la valeur null en null et ne causera pas de crash dans votre application. 

Vous pouvez également utiliser comme?

object.feature = dict["feature"] as? NSNumber

Merci.

33

Voici un code de travail, l'opérateur de conversion de type (comme?) Fera l'affaire ici. Null ne sera pas transtypé dans String, donc l'exécution ira au bloc d'échec.

if let featured = dict["featured"] as? String {
    print("Success")
}
else {
    print("Failure")
}

Essaye ça!

if let demoQuestion = dict.objectForKey("featured"){
     let getValue: String = demoQuestion as! String
}
else {
print("JSON is returning nil")
}
4
Himanshu

Un chaînage facultatif avec if let ou son homologue guard let est le chemin à parcourir. Les trois étapes combinées (manquant, type incorrect - NSNull également, chaîne vide):

guard let featured = dict.objectForKey("featured") as? String where !value.isEmpty else {
    print("featured has wrong value")
}

// do what you need to do with featured

Si vous souhaitez en savoir plus sur l'enchaînement optionnel consultez la documentation

4
Tomasz Bąk

Salut, vous pouvez utiliser la fonction ci-dessous pour supprimer null pour vider la chaîne et éviter les plantages.

func removeNullFromDict (dict : NSMutableDictionary) -> NSMutableDictionary
{
    let dic = dict;

    for (key, value) in dict {

        let val : NSObject = value as! NSObject;
        if(val.isEqual(NSNull()))
        {
            dic.setValue("", forKey: (key as? String)!)
        }
        else
        {
            dic.setValue(value, forKey: key as! String)
        }

    }

    return dic;
}

et avant de donner le dict à n'importe quelle fonction d'appel de méthode en dessous

let newdict = self.removeNullFromDict(dict: dict);
2
Anita

j'ai fait une fonction statique pour convertir la valeur de json en chaîne optionnelle.

class Tools{

    static func setOptionalStr(value : Any?) -> String?{
        guard let string = value as! String?, !string.isEmpty else {
            return nil
        }
        return  value as? String
    }
}

Dans mon contrôleur

let urlStats: String? = Tools.setOptionalStr(value: json["UrlStats"])

je suis ouvert à vos commentaires

1
Jeffrey