Ich habe ein JSON- Objekt, das von einem Webserver stammt.
Das Protokoll sieht ungefähr so aus:
{
"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 eingibt.
Wenn Sie diesen Wert a zuweisen NSString
, wird NSLog
er als ausgegeben<null>
Ich weise die Zeichenfolge folgendermaßen zu:
NSString *tel = [jsonDictionary valueForKey:@"Telephone"];
Wie kann dieser <null>
Wert richtig überprüft werden? Es hindert mich daran, a zu retten NSDictionary
.
Ich habe versucht, die Bedingungen [myString length]
und myString == nil
und zu verwendenmyString == NULL
Wo ist außerdem der beste Ort in der iOS-Dokumentation, um dies zu lesen?
ios
objective-c
json
Chris
quelle
quelle
if ([tel isKindOfClass:[NSNull class]])
Hier ist das Beispiel mit der Besetzung:
if (tel == (NSString *)[NSNull null]) { // do logic here }
quelle
Sie können diesen eingehenden String auch folgendermaßen überprüfen: -
if(tel==(id) [NSNull null] || [tel length]==0 || [tel isEqualToString:@""]) { NSlog(@"Print check log"); } else { NSlog(@Printcheck log %@",tel); }
quelle
NSLog
Linie ist falsch ... es sollte sagen , dass die Zeichenfolge ist leer. Und warum sollten Sie es in diesem Fall drucken?NSLog
für das Wissen, welche Bedingung wahr wirdWenn Sie mit einer "instabilen" API arbeiten, 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
quelle
Die beste Antwort ist, was Aaron Hayman unter der akzeptierten Antwort kommentiert hat:
if ([tel isKindOfClass:[NSNull class]])
Es wird keine Warnung ausgegeben :)
quelle
Wenn Sie viele Attribute in json haben,
if
ist es problematisch , Anweisungen zu verwenden, um sie einzeln zu überprüfen. Was noch schlimmer ist, ist, dass der Code hässlich und schwer zu pflegen wäre.Ich denke, der bessere Ansatz besteht darin, eine Kategorie zu erstellen
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
Nach dem Import dieser Kategorie können Sie:
quelle
Normalerweise mache ich das so:
Assuma Ich habe ein Datenmodell für den Benutzer und es hat eine NSString-Eigenschaft namens E-Mail, die aus einem JSON-Diktat abgerufen wurde. 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:@""]; }
quelle
In Swift können Sie Folgendes tun:
let value: AnyObject? = xyz.objectForKey("xyz") if value as NSObject == NSNull() { // value is null }
quelle
Am besten halten Sie sich an Best Practices, dh verwenden Sie ein echtes Datenmodell, um JSON-Daten zu lesen.
Schauen Sie sich JSONModel an - es ist einfach zu bedienen und konvertiert automatisch [NSNUll null] in * nil * -Werte, sodass Sie Ihre Überprüfungen wie in Obj-c wie folgt 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 Anleitung zum Erstellen einer JSON-basierten App: http://www.touch-code-magazine.com/how-to-make-a-youtube-app-using-mgbox-and-jsonmodel/
quelle
Ich habe viel versucht, aber nichts hat funktioniert. Endlich hat das bei mir geklappt.
NSString *usernameValue = [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"usernameKey"]]; if ([usernameValue isEqual:@"(null)"]) { // str is null }
quelle
if([tel isEqual:[NSNull null]]) { //do something when value is null }
quelle
Versuche dies:
if (tel == (NSString *)[NSNull null] || tel.length==0) { // do logic here }
quelle
Ich benutze das:
#define NULL_TO_NIL(obj) ({ __typeof__ (obj) __obj = (obj); __obj == [NSNull null] ? nil : obj; })
quelle
Wenn wir einen Nullwert wie 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 = @"";
quelle
Hier können Sie dies auch tun, indem Sie die Länge der Zeichenfolge überprüfen, dh
if(tel.length==0) { //do some logic here }
quelle
tel
es sich um eine Instanz von handeltNSNull
, wird eine Ausnahme ausgelöst.