¿Cómo obtengo NSJSONSerialization para mostrar un boolean como verdadero o falso?

Estoy usando datos de NSJSONSerializationWithJSONObject para serializar mis classs a JSON. Cuando serializa un BOOL, le da el valor 1 o 0 en la cadena JSON. Necesito que esto sea verdadero o falso en su lugar. ¿Esto es posible de hacer genéricamente?

No, el object Foundation para un Bool es NSNumber numberWithBool , que se convierte en 0 o 1. No tenemos ningún object Bool . Mismo vaya para leer JSON . Verdadero / falso se convertirá en un NSNumber nuevamente.

Puedes crear una class Bool y build tu propio analizador. Las matrices son Matrices y los objects JSON son NSDictionary . Puedes consultar las keys, probar qué class hay detrás y build la cadena JSON partir de esto.

Cuando creo [NSNumber numberWithBool:NO] , la NSJSONSerialization devuelve la palabra "false" en la cadena JSON.

EDITAR Con los nuevos accesos directos también puedes usar estos types prácticos:

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

De esta forma, puedes evitar algo así como recorrer tus valores. Quiero el comportamiento opuesto exacto pero tengo NSNumber objects. Entonces tengo que bucear …

EDIT II

mbi señaló en los comentarios que hay una diferencia entre las versiones de iOS. Entonces, aquí está una testing de iOS9:

 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} 

Simplemente me encontré con esto, no estoy seguro de si esta es la mejor respuesta, pero …

Asegúrate de usar @YES o @NO, entonces tu json generado tendrá verdadero / falso en él:

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

Por lo tanto, tendrá que convertir sus otros "booleans" / booleans como valores -> @YES / @NO al colocarlos en el dictionary para datos con JSONObject.

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

Sí, es posible generar un boolean (verdadero / falso) con NSJSONSerialization utilizando kCFBooleanTrue y kCFBooleanFalse :

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

entonces

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

Acabo de tocar el problema en iOS9. Mi caso es que tengo una propiedad workout.private que está asignada a NSNumber * por el event handling CoreData.

Al crear JSON [NSNumber numberWithBool:workout.private.boolValue] establece el valor esperado verdadero / falso en JSON, pero solo workout.private o @ (workout.private.boolValue) establece "1" o "0".

Me encontré con un problema similar al usar boolean de CoreData, que se almacena como NSNumber también. La solución más fácil para mí fue usar @ ():

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

Supongo que @ () reconoce el valor BOOL e inicializa el NSNumber con numberWithBool: lo que lleva a true / false en JSON