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?
<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.)
Voici l'exemple avec le casting:
if (tel == (NSString *)[NSNull null])
{
// do logic here
}
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);
}
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
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 :)
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];
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:@""];
}
Dans Swift, vous pouvez faire:
let value: AnyObject? = xyz.objectForKey("xyz")
if value as NSObject == NSNull() {
// value is null
}
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 = @"";
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/
Essaye ça:
if (tel == (NSString *)[NSNull null] || tel.length==0)
{
// do logic here
}
J'utilise ceci:
#define NULL_TO_NIL(obj) ({ __typeof__ (obj) __obj = (obj); __obj == [NSNull null] ? nil : obj; })
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
}
if([tel isEqual:[NSNull null]])
{
//do something when value is null
}