2011-12-04 15 views
10

JSONkit ile AFNeworking ile bir istekte bulunduğumda ve iç içe geçmiş birkaç dizi ve sözlükle (id) JSON aldığımda, bu sorun bana geldi.Değişmez nesneleri dönüştürülebilir nesnelere (özyinelemeli) dönüştürmek için en iyi yaklaşım nedir?

Ben verileri değiştirmek istemiyorum, ben herhangi bir sorun yok:

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

Ama verileri değiştirmek istiyorsanız bir değişken değişkende saklamak gerekir:

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

iç içe diziler veya değişken verilere sözlükleri dönüştürmez sonuncusu; Sadece birinci seviye için çalışır.

Bulduğum tek yolu bu bağlantıda recursive mutable objects; ama bu tür bir sorunu çözmenin en iyi yolunun olup olmadığını bilmiyorum.

Şimdiden teşekkürler.

cevap

11

Sen mutability seçeneği kCFPropertyListMutableContainersAndLeaves ile CoreFoundation işlevini CFPropertyListCreateDeepCopy kullanabilirsiniz:

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

Bir çekicilik gibi çalışır. Teşekkürler! – martinezdelariva

+2

ARC eşdeğeri CFBridgingRelease (CFPropertyListCreateDeepCopy (NULL, (__bridge CFPropertyListRef) (immutableArray), kCFPropertyListMutableContainersAndLeaves)); ' – brainjam

+1

@omz Bu sözlükler için çalışma yapmalı mıdır? Dönüştürmek için görünmüyor. –

5

ARC üzerinde:

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

gerçekten işe yaradı. Teşekkürler brainjam.

+0

Benim için çalışıyor gibi görünüyor. Teşekkürler! – cbh2000

0

Yanıt dizesinde null değerlerine dikkat ettiğinizden emin olun, aksi takdirde size kötü sonuçlara neden olan bir şey döndürmezsiniz. JSON Nesne API yanıtı dönüştürürken

(Örn için. http://www.json-generator.com/api/json/get/bQVoMjeJOW?indent=1 gelen mutataing yanıtı deneyin)

Sadece sınırının altında yerleştirin.

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]; 

Yani JSON nesnesi hiçbir boş karakterler, CFPropertyListCreateDeepCopy kullanarak dolayısıyla hiçbir sorun olmayacaktır.

Şerefe!

İlgili konular