webentwicklung-frage-antwort-db.com.de

Überprüfung eines Nullwerts in Objective-C, der von einer JSON-Zeichenfolge zurückgegeben wurde

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?

78
Chris

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

186
Wevah

Hier ist das Beispiel mit der Besetzung:

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

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

}
10
Nitin Gohel

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
9
Kyle C

Die beste Antwort ist, was Aaron Hayman unterhalb der akzeptierten Antwort kommentiert hat:

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

Es erzeugt keine Warnung :)

4
kjoelbro

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];
3
Brian

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:@""];
}
2

In Swift können Sie:

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

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/

0
Marin Todorov

Versuche dies:

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

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
}
0
user5930025
if([tel isEqual:[NSNull null]])
{
   //do something when value is null
}
0