2016-05-03 7 views
1

ich einen Fehler mit dem folgenden Code bin immer wenn einige json null ist, obwohl ich das erst zu prüfen, versuchen:IOS: Wie JSON-Objekt zu überprüfen, ist nicht null

Edit: Vorstehende Code:

NSData* data = [NSData dataWithContentsOfURL: kItemsURL]; 
      //previous line grabed data from api. 
      if (data) { 
       [self performSelectorOnMainThread:@selector(fetchData:) withObject:data waitUntilDone:YES]; 
} 
- (void)fetchData:(NSData *)jsonFeed { 
    NSError* error; 
     NSDictionary* json = [NSJSONSerialization JSONObjectWithData:jsonFeed               options:kNilOptions                error:&error]; 

//Original code provided 
    if (![[json objectForKey:@"items"] isKindOfClass:[NSNull class]]) { 
      NSLog(@"got here"); 
      NSLog(@"json%@",json); 
      latestItems = [[json objectForKey:@"items"]mutableCopy]; 
    } 

Gibt es eine bessere Möglichkeit zu überprüfen, Json ist nicht null?

Hier ist Fehlerausgang:

2016-05-03 13:05:43.820 testApp[407:60b] got here 
2016-05-03 13:05:43.821 testApp[407:60b] json{ 
    items = "<null>"; 
} 
NSNull mutableCopyWithZone:]: unrecognized selector sent to instance 0x3ac26a70 
2016-05-03 13:05:43.825 ChallengeU[407:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull mutableCopyWithZone:]: unrecognized selector sent to instance 0x3ac26a70' 
+0

Weisen Sie '[json objectForKey: @" items "]' einer Variablen zu. Protokolliere die 'class' dieser Variablen. Aktualisieren Sie Ihre Frage mit diesen Änderungen und dieser Ausgabe. Verwenden Sie diese Variable in der Anweisung 'if' und dem Aufruf von 'mutableCopy'. – rmaddy

+0

Es ist ein Wörterbuch: json class__NSCFDictionary. Ich habe den obigen Code oben hinzugefügt. – zztop

+0

Das habe ich nicht gefragt. Wir wissen, dass 'json' ein Wörterbuch von Ihrer ursprünglichen Frage ist. Was ist das Ergebnis von '[json objectForKey: @" items "]'? – rmaddy

Antwort

0
if (![json[@"items"] isEqual:[NSNull null]]) { 
//do your stuff in here 

} 
+0

wäre dies nur json [@ "Artikel"] oder json objectForKey (@ "Artikel")] – zztop

+0

@zztop beide bedeuten die gleiche Sache – rounak

-2
if ([json objectForKey:@"items"] != nil) { 
     NSLog(@"got here"); 
     NSLog(@"json%@",json); 
     latestItems = [[json objectForKey:@"items"]mutableCopy]; 
} 

NULL oder null ist keine Klasse, sondern eine Konvention. Die Speicheradresse 0 ist der Punkt, an dem eine CPU beginnt, Code während des Kaltstarts auszuführen. Daher kann kein Objekt diese Adresse im Speicher haben.

Nach dem Buch sollte der JSON nicht den Schlüssel @ "Elemente", wenn der Wert von @ "Elemente" ist NULL. Der fehlende Schlüssel zeigt einen NULL-Wert an.

+0

Bitte suchen Sie in der Dokumentation für die Klasse NSNull . JSON-Dokumente enthalten Nullwerte. Explizite NULL-Werte, die in [NSNull null], nicht nil oder NULL übersetzt werden. – gnasher729

+0

Und die erste Zeile Code ist Unsinn. objectForKey _never_ gibt nil zurück, es sei denn, json selbst ist null. – gnasher729

+0

@ gnasher729 Falsch. 'objectForKey:' gibt 'nil' zurück, wenn kein solcher Schlüssel im Wörterbuch vorhanden ist. Aber das hat nichts damit zu tun, ob dieses spezielle Wörterbuch einen 'NSNull'-Wert für den Schlüssel gespeichert hat. – rmaddy

0

Ich weiß nicht, was mit Ihrem Code falsch ist, aber der einfachste Weg für einen JSON Null-Wert zu überprüfen, ob Sie sicher sind, dass json ein Wörterbuch ist,:

if (json [@"items"] != [NSNull null]) { ... } 

[NSNull null] immer gibt dieselbe Instanz von NSNull zurück. Es gibt nie mehr als eine Instanz von NSNull. Daher können Sie mithilfe des Zeigervergleichs überprüfen, ob ein Objekt eine NSNull-Instanz ist.

-1
if (json && [json isKindOfClass:[NSDictionary class]]) { 
    //your code here 
} else { 
    //invalid json 
} 
Verwandte Themen