2012-11-28 1 views
22

Ich benutze NSJSONSerialization dataWithJSONObject, um meine Klassen zu JSON zu serialisieren. Wenn es einen BOOL serialisiert, gibt es ihm den Wert 1 oder 0 in der JSON-Zeichenfolge. Ich brauche das stattdessen wahr oder falsch. Ist das generisch möglich?Wie bekomme ich NSJSONSerialization einen Boolean als wahr oder falsch ausgeben?

+0

Irgendwelche von diesen sind wirklich die wirkliche Antwort: http://Stackoverflow.com/a/17234722/105903 oder http://stackoverflow.com/a/28450291/105903. Darf ich es als solches bezeichnen? –

+0

Es sei denn, Sie sind ein Zeitfahrer, es ist nicht die richtige Antwort. Bitte notieren Sie das Datum, an dem diese Frage gestellt und beantwortet wurde. Vielen Dank. –

Antwort

3

Nein, das Foundation Objekt für ein Bool ist NSNumbernumberWithBool, das entweder 0 oder 1 wird. Wir haben kein Bool Objekt. Gleiches gilt für das Lesen JSON. Wahr/falsch wird wieder zu einem NSNumber. Sie können eine Bool Klasse erstellen und Ihren eigenen Parser erstellen. Arrays sind Arrays und JSON Objekte sind NSDictionary. Sie können die Schlüssel abfragen, testen, welche Klasse dahinter liegt und daraus den JSON String erstellen.

+2

danke, ich habe meine eigene JSONBool-Klasse erstellt und konnte es so funktionieren lassen –

+0

@TritonMan Meinung mehr Code in der JSONBool-Klasse posten? Versuchen, das Gleiche zu erreichen. – TahoeWolverine

+0

Ja, die Art, wie NSJSONSerialization funktioniert, hat sich im Laufe der Jahre verändert. Bitte notieren Sie das Datum, an dem diese Frage gestellt und beantwortet wurde. –

22

Wenn ich [NSNumber numberWithBool:NO] erstelle, gibt die NSJSONSerialization das Wort "false" in der JSON-Zeichenfolge zurück.

EDIT Mit den neuen Verknüpfungen, die Sie auch diese handliche Jungs verwenden können:

@(YES)/ @(NO) 
@(1) / @(0) 
@YES / @NO 
@1 / @0 

diese Weise können Sie so etwas wie Looping durch Ihre Werte vermeiden. Ich möchte das genaue Gegenteil Verhalten aber NSNumber Objekte haben. Also ich muss Schleife ...

EDIT II

mbi in den Kommentaren darauf hingewiesen, dass es einen Unterschied zwischen iOS-Versionen. Also hier ist ein iOS9 Test:

NSDictionary *data = @{ 
    @"a": @(YES), 
    @"b": @YES, 
    @"c": @(1), 
    @"d": @1 
}; 
NSLog(@"%@", [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:data options:0 error:nil] encoding:NSUTF8StringEncoding]); 

2016-07-05 02:23:43.964 Test App[24581:6231996] {"a":true,"b":true,"c":1,"d":1} 
+2

Hier ist ein kleiner Vorbehalt zwischen iOS-Versionen! Dieser Code '[NSJSONSerialization dataWithJSONObject: @ {@" Test1 ": @ YES, @" Test2 ": @ (YES), @" Test3 ": @true, @" Test4 ": @ (true)} Optionen: nil error: nil] ' produziert diese json auf iOS 9 ' {"Test4": wahr, "Test3": true, "Test2": true, "Test1": true} ' aber produziert diese JSON auf iOS 8 und unter '{" Test4 ": 1," Test3 ": 1," Test2 ": true," Test1 ": true}' – mbi

+0

Interessant ... Danke für diese Beobachtung! –

+0

Nein, das habe ich nicht gesehen. Ich werde meinen Kommentar löschen. Danke für das Aufzeigen! –

12

Nur über diese selbst lief, nicht sicher, ob dies die beste Antwort ist, aber ...

Stellen Sie sicher, @YES oder @NO zu verwenden, dann ausgegeben json wird in es wahr/falsch:

[NSJSONSerialization dataWithJSONObject:@{@"test": @YES} options:0 error: nil]; 

So werden Sie Ihre anderen "booleans"/boolean wie Werte drehen müssen -> @YES/@NO beim Putten in das Wörterbuch für dataWithJSONObject.

[NSJSONSerialization dataWithJSONObject:@{@"test": (boolLikeValue ? @YES : @NO)} options:0 error: nil]; 
0

Ich stieß auf ähnliche Problem bei der Verwendung von CoreData Boolean, die auch als NSNumber gespeichert wird. Die einfachste Lösung für mich wurde mit @():

[NSJSONSerialization dataWithJSONObject:@{@"bool": @([object.value boolValue])} options:0 error: nil]; 

Ich denke, @() gibt den BOOL Wert erkennen und die NSNumber mit numberWithBool initialisieren: die

3

auf true/false in JSON führt Ja, es möglich ist, eine Boolesche (true/false) mit NSJSONSerialization durch Verwendung kCFBooleanTrue und kCFBooleanFalse zur Ausgabe:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:kCFBooleanTrue, @"key_1", 
          kCFBooleanFalse, @"key_2", 
          nil] 

dann

NSError *error = nil; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions error:&error]; 
1

Ich habe gerade das Problem auf iOS9 getroffen. Mein Fall ist, dass ich eine CoreData-Eigenschaft workout.private haben, die Bool auf NSNumber * wegen CoreData-Behandlung zugeordnet ist.

Wenn JSON Erstellen [NSNumber numberWithBool:workout.private.boolValue] Sätze true/false in JSON erwartet, aber nur workout.private oder @ (workout.private.boolValue) setzt "1" oder "0".

Verwandte Themen