JSONKit: mutevole e serializzazione del valore dell'attributo JSON
-
25-10-2019 - |
Domanda
Sto usando JSONKit analizzare la stringa JSON in NSDictionary:
NSDictionary *deserializedData = [jsonString objectFromJSONString];
La mia domanda è: come posso cambiare i valori del dizionario e ottenere una cambiata JSON Stringa
?ho cercato di modificare i valori del dizionario:
[deserializedData setObject:[NSNumber numberWithInt:iRatings] forKey:@"ratings"];
Ma l'applicazione si blocca in quella linea. Che cosa sto facendo di sbagliato?
Grazie in anticipo!
Soluzione
Mentre le altre risposte sono corrette, quello che vuole veramente in questo caso è:
NSMutableDictionary *deserializedData = [jsonString mutableObjectFromJSONString];
Il metodo mutableObjectFromJSONString
creerà direttamente un dizionario mutevole, che consente di risparmiare tempo e memoria.
Altri suggerimenti
NSDictionary
è un dizionario immutabile, è necessario NSMutableDictionary
per modificare i dati. Io non sono sicuro di JSONKit, ma il built-in Cocoa JSON parser ha una bandiera per restituire i dati in contenitori mutabili.
Nel peggiore dei casi, si può fare qualcosa di simile:
NSMutableDictionary* data = [NSMutableDictionary dictionaryWithDictionary:[jsonString objectFromJSONString]];
[data setObject:[NSNumber numberWithInt:iRatings] forKey:@"ratings"];
//
// we begin with our string in json format
//
NSString *jsonString = [[NSString alloc] initWithString:@"{\"1\":\"Hole 1: Rossy Robinson - $25\",\"2\":\"Hole 7: Davey Ambrose - $25\",\"3\":\"Hole 14: Ross Robinson - $25\"}"];
//
// convert the json string to an NSMutableDictionary
//
NSError *e;
NSMutableDictionary *JSONdic = [NSJSONSerialization JSONObjectWithData: [jsonString dataUsingEncoding: NSUTF8StringEncoding] options: NSJSONReadingMutableContainers error: &e];
//
// change a value and add a new value in the dict
//
NSLog(@"before: object for key 1 is: %@", [JSONdic objectForKey:@"1"]);
[JSONdic setObject:@"xxx" forKey:@"1"];
[JSONdic setObject:@"Phil McQuitty" forKey:@"2"];
//
//convert dictionary object to json data
//
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:JSONdic options:NSJSONWritingPrettyPrinted error:&e];
//
// convert the json data back to a string
//
NSString *jsonText = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];\
//
// print out the final results
//
NSLog(@"back to string: %@", jsonText);
Si tenta di modificare un immutableobject.
NSMutableDictionary *deserializedData = [NSMutableDictionary dictionaryWithDictionary: [jsonString objectFromJSONString]];
Questo è un dizionario mutabile ed è possibile modificare i valori in esso.
Si tenta in questo modo:
NSMutableDictionary *deserializedData = [NSMutableDictionary dictionaryWithDictionary: [jsonString objectFromJSONString]];
e quindi modificare i valori:
[deserializedData setObject:[NSNumber numberWithInt:iRatings] forKey:@"ratings"];
Per NSDictionary
non possiamo aggiungere o modificare i valori, ecco perché l'applicazione si blocca.