Eliminar keys / valores de nsdictionary

Estoy tratando de convertir mi conetworkingata en json, he estado luchando para lograr que esto funcione, pero he encontrado una forma que está casi funcionando.

mi código:

NSArray *keys = [[[self.form entity] attributesByName] allKeys]; NSDictionary *dict = [self.form dictionaryWithValuesForKeys:keys]; NSLog(@"dict::%@",dict); NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string error:&error]; if (! jsonData) { NSLog(@"Got an error: %@", error); } else { NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; NSLog(@"json::%@",jsonString); } 

También "forma" es:

  @property (strong, retain) NSManagedObject *form; 

Esto funciona bien, excepto que tengo NSIndexSet guardado en algunos de los attributes de conetworkingata. Esto plantea un problema con la escritura JSON. Ahora, mis sets de índices no necesitan ser convertidos a json, así que me preguntaba si había una manera de eliminar todos los índices del dictado. o tal vez hay una mejor manera de hacer esto que no conozco.

aquí es parte del nslog de dict:

 ... whereExtent = ""; wiring = ( ); wiring1 = "<NSIndexSet: 0x82b0600>(no indexes)"; wiringUpdated = "<null>"; yardFenceTrees = "<null>"; } 

así que en este caso quiero eliminar "wiring1" de dict pero necesito poder hacerlo de manera "dinámica" (sin usar el nombre "wiring1" para eliminarlo)

Para poder eliminar valores, su dictionary debe ser una instancia de la class NSMutableDictionary .

Para eliminar dinámicamente los valores, obtenga todas las keys de dict, pruebe el object de cada key y elimine los objects innecesarios:

 NSArray *keys = [dict allKeys]; for (int i = 0 ; i < [keys count]; i++) { if ([dict[keys[i]] isKindOfClass:[NSIndexSet class]]) { [dict removeObjectForKey:keys[i]]; } } 

Nota: Eliminar valores no funciona con enumeración rápida. Como un pirateo rápido alternativo, puede crear un dictionary nuevo sin objects innecesarios.

Utilice NSMutableDictionary en lugar de NSDictionary. Su código se verá así:

 NSMutableDictionary *dict = [[self.form dictionaryWithValuesForKeys:keys] mutableCopy]; //create dict [dict removeObjectForKey:@"wiring1"]; //remove object 

No olvides usar mutableCopy.

Este código de ejemplo pasará por un NSDictionary y buildá un nuevo NSMutableDictionary contenga solo properties seguras para JSON.

Por el momento no funciona de forma recursiva, por ejemplo, si su dictionary contiene un dictionary o matriz, lo dejará en lugar de pasar por el dictionary y arreglarlo, pero es lo suficientemente simple como para agregarlo.

 // Note: does not work recursively, eg if the dictionary contains an array or dictionary it will be dropped. NSArray *allowableClasses = @[[NSString class], [NSNumber class], [NSDate class], [NSNull class]]; NSDictionary *properties = @{@"a":@"hello",@"B":[[NSIndexSet alloc] init]}; NSMutableDictionary *safeProperties = [[NSMutableDictionary alloc] init]; [properties enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){ BOOL allowable = NO; for (Class allowableClass in allowableClasses) { if ([obj isKindOfClass:allowableClass]) { allowable = YES; break; } } if (allowable) { safeProperties[key] = obj; } }]; NSLog(@"unsafe: %@, safe: %@",properties,safeProperties);