Ich habe ein JSON Objekt, das von einem Webserver kommt.
Das Protokoll ist ungefähr so:
{
"status":"success",
"UserID":15,
"Name":"John",
"DisplayName":"John",
"Surname":"Smith",
"Email":"email",
"Telephone":null,
"FullAccount":"true"
}
Beachten Sie, dass das Telefon als Null eingeht, wenn der Benutzer keine Telefonverbindung eingibt.
Wenn Sie diesen Wert einem NSString
zuweisen, wird er im NSLog
als <null>
ausgegeben
Ich weise die Zeichenfolge so zu:
NSString *tel = [jsonDictionary valueForKey:@"Telephone"];
Wie überprüfe ich diesen <null>
-Wert? Das hindert mich daran, eine NSDictionary
zu speichern.
Ich habe versucht, die Bedingungen [myString length]
und myString == nil
und myString == NULL
zu verwenden.
Wo ist außerdem der beste Ort in der iOS-Dokumentation, um sich darüber zu informieren?
<null>
protokolliert der NSNull-Singleton. So:
if (tel == (id)[NSNull null]) {
// tel is null
}
(Das Singleton existiert, weil Sie nil
nicht zu Auflistungsklassen hinzufügen können.)
Hier ist das Beispiel mit der Besetzung:
if (tel == (NSString *)[NSNull null])
{
// do logic here
}
sie können diesen eingehenden String auch auf diese Weise überprüfen: -
if(tel==(id) [NSNull null] || [tel length]==0 || [tel isEqualToString:@""])
{
NSlog(@"Print check log");
}
else
{
NSlog(@Printcheck log %@",tel);
}
Wenn Sie es mit einer "instabilen" API zu tun haben, möchten Sie möglicherweise alle Schlüssel durchlaufen, um nach Null zu suchen. Ich habe eine Kategorie erstellt, um damit umzugehen:
@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
Die beste Antwort ist, was Aaron Hayman unterhalb der akzeptierten Antwort kommentiert hat:
if ([tel isKindOfClass:[NSNull class]])
Es erzeugt keine Warnung :)
wenn Sie viele Attribute in json haben, ist die Verwendung der if
-Anweisung, um sie einzeln zu überprüfen, mühsam. Was noch schlimmer ist, dass der Code hässlich und schwer zu warten wäre.
Ich denke, der bessere Ansatz ist die Erstellung einer Kategorie von 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
nachdem Sie diese Kategorie importiert haben, können Sie:
[json validatedValueForKey:key];
Ich mache es normalerweise so:
Assuma Ich habe ein Datenmodell für den Benutzer, und es hat eine NSString-Eigenschaft namens email, die von einem JSON-Diktier abgerufen wird. Wenn das E-Mail-Feld in der Anwendung verwendet wird, verhindert das Konvertieren in eine leere Zeichenfolge mögliche Abstürze:
- (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:@""];
}
In Swift können Sie:
let value: AnyObject? = xyz.objectForKey("xyz")
if value as NSObject == NSNull() {
// value is null
}
wenn wir einen Nullwert erhalten, können wir ihn mit dem folgenden Codeausschnitt überprüfen.
if(![[dictTripData objectForKey:@"mob_no"] isKindOfClass:[NSNull class]])
strPsngrMobileNo = [dictTripData objectForKey:@"mobile_number"];
else
strPsngrMobileNo = @"";
Am besten wäre es, wenn Sie sich an Best Practices halten - d. H. Ein echtes Datenmodell verwenden, um JSON-Daten zu lesen.
Schauen Sie sich JSONModel an - es ist einfach zu bedienen und konvertiert [NSNUll null] in * nil * Werte automatisch für Sie, so dass Sie Ihre Prüfungen wie gewohnt in Obj-c durchführen können:
if (mymodel.Telephone==nil) {
//telephone number was not provided, do something here
}
Schauen Sie sich die Seite von JSONModel an: http://www.jsonmodel.com
Hier ist auch eine einfache Einführung zum Erstellen einer JSON-basierten App: http://www.touch-code-magazine.com/how-to-make-a-youtube-app-using-mgbox-and-jsonmodel/
Versuche dies:
if (tel == (NSString *)[NSNull null] || tel.length==0)
{
// do logic here
}
Ich benutze das:
#define NULL_TO_NIL(obj) ({ __typeof__ (obj) __obj = (obj); __obj == [NSNull null] ? nil : obj; })
Ich habe eine Menge Methode ausprobiert, aber nichts hat funktioniert ... Endlich hat das für mich funktioniert.
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
}