78 votes

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

J'ai un JSON objet qui est à venir à partir d'un serveur web.

Le journal est quelque chose comme ceci:

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

Remarque le Téléphone est de venir en valeur null si l'utilisateur n'entre pas un.

Lors de l'attribution de cette valeur à un NSString, en NSLog sortir comme <null>

Je suis affectant la chaîne comme ceci:

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

Quelle est la bonne façon de vérifier cette <null> de la valeur? Il m'empêche de l'enregistrement d'un NSDictionary.

J'ai essayé en utilisant les conditions [myString length] et myString == nil et myString == NULL

De plus où est le meilleur endroit dans l'iOS de la documentation à lire sur ce?

189voto

Wevah Points 17636

<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 collection.)

24voto

Flea Points 3308

Voici l'exemple avec le casting:

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

10voto

Nitin Gohel Points 19461

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);  

}
 

9voto

Kyle C Points 2442

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
 

3voto

Brian Points 3134

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

Je pense que la meilleure approche consiste à 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];
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X