JSON, NSCFBoolean - Ja oder Nein

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • JSON, NSCFBoolean - Ja oder Nein

    Mit dem JSON Framework meiner Wahl parse ich

    Quellcode

    1. {"userId":"42","username":"MISTER42","created":"2012-05-24 10:24:22","active":false,"picture":""}


    Dann lasse ich mir ausgeben

    Quellcode

    1. NSLog(@"active: %@", [results objectForKey:@"active"]);
    2. NSLog(@"type: %@", [[results objectForKey:@"active"] class]);
    3. NSLog(@"active as string: %@", [results objectForKey:@"active"] ? @"YES" : @"NO");


    Und bekomme:

    Quellcode

    1. 2012-05-24 10:55:58.121 xxx[4828:f803] active: 0
    2. 2012-05-24 10:55:58.121 xxx[4828:f803] type: __NSCFBoolean
    3. 2012-05-24 10:55:58.121 xxx[4828:f803] active as string: YES


    Spinn ich? Das ist 1x1... Da läuft doch einiges ganz grundlegend falsch. Ich habe manchmal das Gefühl, ich werde dazu gezungen Spagetticode zu schreiben.
  • Ersetze er

    C-Quellcode

    1. NSLog(@"active as string: %@", [results objectForKey:@"active"] ? @"YES" : @"NO");

    durch

    C-Quellcode

    1. NSLog(@"active as string: %@", ([results objectForKey:@"active"]!=0) ? @"YES" : @"NO");

    und versuche es noch einmal.

    Es kann durchaus sein, dass eine Objektprüfung auf nil statt findet. Da __NSCFBoolean nicht nil ist, stimmt auch die Abfrage.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • objectForKey: liefert Dir einen Zeiger auf ein Objekt zurück (NSCFBoolean ist eine private Subklasse von NSNumber). Der Zeiger wird immer != 0 sein und daher als 'wahr' ausgewertet. So wird da ein Schuh draus:

    NSLog(@"active as string: %@", [[results objectForKey:@"active"] boolValue] ? @"YES" : @" :rolleyes: NO");

    Michael
  • Der gute Michael hat wie (fast) immer Recht. Man nennt das übrigens Boxing, wenn du dazu (von wegen Grundlagen und 1x1) etwas lesen willst. Etwa hier:
    en.wikipedia.org/wiki/Boxing_(computer_science)#Boxing

    bei KVC gilt das auch, wenn die dahinterstehende Eigenschaft den primitiven Datentypen BOOL (oder sonst einen) hat. Das ist eine Form des Autoboxing.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Michael schrieb:

    objectForKey: liefert Dir einen Zeiger auf ein Objekt zurück (NSCFBoolean ist eine private Subklasse von NSNumber). Der Zeiger wird immer != 0 sein und daher als 'wahr' ausgewertet.

    +narf+
    Richtige Idee gehabt und nicht bis zum Schluss gedacht.
    Sorry und danke für die Erläuterung.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P