2011-12-04 7 views
10

In particolare, questo problema mi è venuto quando ho fatto una richiesta con AFNeworking con JSONkit e ho ricevuto un JSON (id) con diversi array e dizionari annidati.Qual è l'approccio migliore per convertire oggetti immutabili in oggetti mutabili (ricorsivi)?

Se io non voglio modificare i dati, non ho alcun problema:

self.myNSArray = [JSON objectForKey:@"result"];

Ma se voglio modificare i dati che devono memorizzare in una variabile mutabile:

self.myNSMutableArray = [[JSON objectForKey:@"result"] mutableCopy];

L'ultimo non converte gli array nidificati o dizionari ai dati mutabile; funziona solo per il primo livello.

L'unico modo che ho trovato è su questo collegamento recursive mutable objects; ma non so se c'è un modo migliore per risolvere questo tipo di problema.

Grazie in anticipo.

risposta

11

È possibile utilizzare la funzione di CoreFoundation CFPropertyListCreateDeepCopy con l'opzione mutevolezza kCFPropertyListMutableContainersAndLeaves:

NSArray *immutableArray = [JSON objectForKey:@"result"]; 
self.myMutableArray = [(NSMutableArray *)CFPropertyListCreateDeepCopy(NULL, immutableArray, kCFPropertyListMutableContainersAndLeaves) autorelease]; 
+0

Funziona come un fascino. Grazie! – martinezdelariva

+2

L'equivalente ARC sembra essere 'CFBridgingRelease (CFPropertyListCreateDeepCopy (NULL, (__bridge CFPropertyListRef) (immutableArray), kCFPropertyListMutableContainersAndLeaves))' – brainjam

+1

@omz Se questo lavoro per i dizionari, lo sai? Non riesco a farlo convertire. –

5

sull'arco:

CFBridgingRelease(CFPropertyListCreateDeepCopy(NULL, (__bridge CFPropertyListRef)(immutableArray), kCFPropertyListMutableContainersAndLeaves)) 

davvero funzionato. Grazie brainjam.

+0

Sembra funzionare per me. Grazie! – cbh2000

0

Assicurarsi che ci si stia prendendo cura dei valori null nella stringa di risposta, altrimenti restituirà nil che causerà risultati orribili.

(per esempio. Prova risposta mutataing da http://www.json-generator.com/api/json/get/bQVoMjeJOW?indent=1)

Il posto giusto sotto la linea durante la conversione di risposta API per JSON oggetto.

responseString=[responseString stringByReplacingOccurrencesOfString:@"\":null" withString:@"\":\"\""];//To Handle Null Characters 

//Search for below line in your parsing library and paste above code 
data = [responseString dataUsingEncoding:NSUTF8StringEncoding]; 

Quindi non ci saranno caratteri nulli nel oggetto JSON, quindi nessun problema con l'utilizzo di CFPropertyListCreateDeepCopy.

Saluti !!