2011-12-04 57 views
10

具体来说,当我用JSONkit与AFNeworking一起发出请求并接收一个嵌套了几个数组和字典的(id)JSON时,会出现这个问题。将不可变对象转换为可变对象(递归)的最佳方法是什么?

如果我不想修改数据,我没有任何问题:

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

但是,如果我想修改数据,我必须将其存储在一个可变变量:

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

最后一个不转换嵌套数组或词典来可变数据;它只适用于第一级。

我发现的唯一方法是在此链接recursive mutable objects;但我不知道是否有最佳方法来解决这类问题。

在此先感谢。

回答

11

您可以使用的CoreFoundation功能CFPropertyListCreateDeepCopy与可变性选项kCFPropertyListMutableContainersAndLeaves

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

它像一个魅力。谢谢! – martinezdelariva

+2

ARC的等价似乎是'CFBridgingRelease(CFPropertyListCreateDeepCopy(NULL,(__bridge CFPropertyListRef)(immutableArray),kCFPropertyListMutableContainersAndLeaves));' – brainjam

+1

@omz这个工作对于字典,你知道吗?似乎无法让它转换。 –

5

在ARC:

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

果然奏效。谢谢 brainjam。

+0

它似乎为我工作。谢谢! – cbh2000

0

请确保你正在处理响应字符串中的null值,否则它会返回你零,从而导致可怕的结果。

(对于例如,尝试从 http://www.json-generator.com/api/json/get/bQVoMjeJOW?indent=1 mutataing响应)

只要将以下行转换到JSON对象API响应时。

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

所以会有你的JSON对象中没有空字符,因此没有使用CFPropertyListCreateDeepCopy问题。

干杯!

相关问题