web-dev-qa-db-fra.com

Vérification d'une valeur null dans Objective-C qui a été renvoyée à partir d'une chaîne JSON

J'ai un objetJSONqui provient d'un serveur Web.

Le journal ressemble à ceci:

{          
   "status":"success",
   "UserID":15,
   "Name":"John",
   "DisplayName":"John",
   "Surname":"Smith",
   "Email":"email",
   "Telephone":null,
   "FullAccount":"true"
}

Notez que le téléphone arrive comme nul si l'utilisateur n'en saisit pas un.

Lorsque vous affectez cette valeur à une NSString, dans la NSLog elle sortira sous la forme <null>

J'assigne la chaîne comme ceci:

NSString *tel = [jsonDictionary valueForKey:@"Telephone"];

Quelle est la bonne façon de vérifier cette valeur <null>? Cela m'empêche de sauvegarder une NSDictionary.

J'ai essayé d'utiliser les conditions [myString length] et myString == nil et myString == NULL

De plus, quel est le meilleur endroit dans la documentation iOS pour lire ceci?

78
Chris

<null> est comment le singleton NSNull enregistre. Alors:

if (tel == (id)[NSNull null]) {
    // tel is null
}

(Le singleton existe parce que vous ne pouvez pas ajouter nil aux classes de la collection.)

186
Wevah

Voici l'exemple avec le casting:

if (tel == (NSString *)[NSNull null])
{
   // do logic here
}
24
Flea

vous pouvez aussi vérifier cette chaîne entrante comme ceci: -

if(tel==(id) [NSNull null] || [tel length]==0 || [tel isEqualToString:@""])
{
    NSlog(@"Print check log");
}
else
{  

    NSlog(@Printcheck log %@",tel);  

}
10
Nitin Gohel

Si vous utilisez une API "instable", vous pouvez parcourir toutes les clés pour rechercher la valeur null. J'ai créé une catégorie pour traiter ceci:

@interface NSDictionary (Safe)
-(NSDictionary *)removeNullValues;
@end

@implementation NSDictionary (Safe)

-(NSDictionary *)removeNullValues
{
    NSMutableDictionary *mutDictionary = [self mutableCopy];
    NSMutableArray *keysToDelete = [NSMutableArray array];
    [mutDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        if (obj == [NSNull null]) 
        {
            [keysToDelete addObject:key];
        }
    }];
    [mutDictinary removeObjectsForKeys:keysToDelete];
    return [mutDictinary copy];
}
@end
9
Kyle C

La meilleure réponse est ce que Aaron Hayman a commenté ci-dessous la réponse acceptée:

if ([tel isKindOfClass:[NSNull class]])

Cela ne produit pas d'avertissement :)

4
kjoelbro

si vous avez beaucoup d'attributs dans json, utiliser l'instruction if pour les vérifier un par un est problématique. Le pire est que le code serait moche et difficile à maintenir.

Je pense que la meilleure approche est de créer une catégorie de NSDictionary:

// NSDictionary+AwesomeDictionary.h

#import <Foundation/Foundation.h>

@interface NSDictionary (AwesomeDictionary)
- (id)validatedValueForKey:(NSString *)key;
@end

// NSDictionary+AwesomeDictionary.m

#import "NSDictionary+AwesomeDictionary.h"

@implementation NSDictionary (AwesomeDictionary)
- (id)validatedValueForKey:(NSString *)key {
    id value = [self valueForKey:key];
    if (value == [NSNull null]) {
        value = nil;
    }
    return value;
}
@end

après avoir importé cette catégorie, vous pouvez:

[json validatedValueForKey:key];
3
Brian

Je le fais habituellement comme ça:

Assuma J'ai un modèle de données pour l'utilisateur, et il possède une propriété NSString appelée email, extraite d'un dict JSON. Si le champ de courrier électronique est utilisé dans l'application, le convertir en chaîne vide évite les blocages éventuels:

- (id)initWithJSONDictionary:(NSDictionary *)dictionary{

    //Initializer, other properties etc...

    id usersmail = [[dictionary objectForKey:@"email"] copy];
    _email = ( usersmail && usersmail != (id)[NSNull null] )? [usersmail copy] : [[NSString      alloc]initWithString:@""];
}
2
Yunus Nedim Mehel

Dans Swift, vous pouvez faire:

let value: AnyObject? = xyz.objectForKey("xyz")    
if value as NSObject == NSNull() {
    // value is null
    }
2
Segev

si nous obtenons une valeur nulle comme alors nous pouvons le vérifier avec l'extrait de code ci-dessous.

 if(![[dictTripData objectForKey:@"mob_no"] isKindOfClass:[NSNull class]])
      strPsngrMobileNo = [dictTripData objectForKey:@"mobile_number"];
  else
           strPsngrMobileNo = @"";
0

Si vous vous en teniez aux meilleures pratiques, le mieux serait d’utiliser un vrai modèle de données pour lire les données JSON. 

Jetez un coup d'œil à JSONModel - il est facile à utiliser et convertira automatiquement [NSNUll null] en * nil *, afin que vous puissiez faire vos vérifications comme d'habitude dans Obj-c comme:

if (mymodel.Telephone==nil) {
  //telephone number was not provided, do something here 
}

Consultez la page de JSONModel: http://www.jsonmodel.com

Voici également une procédure simple pour créer une application basée sur JSON: http://www.touch-code-magazine.com/how-to-make-a-youtube-app-using-mgbox-and-jsonmodel/

0
Marin Todorov

Essaye ça:

if (tel == (NSString *)[NSNull null] || tel.length==0)
{
    // do logic here
}
0
Mritunjay

J'utilise ceci:

#define NULL_TO_NIL(obj) ({ __typeof__ (obj) __obj = (obj); __obj == [NSNull null] ? nil : obj; }) 
0

J'ai essayé beaucoup de méthode, mais rien n'a fonctionné ..__ Enfin, cela a fonctionné pour moi.

NSString *usernameValue = [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"usernameKey"]];

if ([usernameValue isEqual:@"(null)"])
{
     // str is null
}
0
user5930025
if([tel isEqual:[NSNull null]])
{
   //do something when value is null
}
0
Gajendra K Chauhan