在我的项目中,我必须加载一些json文件 . 我用JSONKit解析它们并在每次解析之后
NSMutableDictionary *json = [myJSON objectFromJSONString];
我将它们添加到一个数组中,如:
[self.themeArray addObject:json];
这到目前为止工作正常 . 现在我需要在视图之间传递字典 . 到目前为止工作,但我需要添加更多的对象到字典对象 - > json . 即使我将json声明为NSMutableDictionary它也不允许我添加对象,因为JSONKit解析器似乎创建了不可变的字典 .
我正在考虑创建一个包含json字典和我的附加数据的对象,所以我不必更改json字典 . 我甚至可以将其更改为NSDictionary,因为无需更改它 . 但这对我来说似乎不太优雅 .
您是否知道如何在不更改JSONKit库的情况下解决此问题?
提前致谢!
EDIT
我刚刚将代码更改为
NSMutableDictionary *json = [[myJSON objectFromJSONString] mutableCopy];
这样的事情
[[self.theme objectForKey:@"theme"] setObject:sender forKey:@"sender"];
[[self.theme objectForKey:@"theme"] setValue:sender forKey:@"sender"];
Xcode引发异常:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '*** - [JKDictionary setObject:forKey:]:发送到不可变对象的mutating方法'
我认为这是因为在高级字典中仍然存在嵌套字典 . 然后我将通过我的json对象进行交互,将所有字典复制到可变字典中,对吧?
也许按照Guillaume的建议切换到NSJSONSerialization会更好 .
EDIT
我刚试过这样的事情
[self.theme setValue:sender forKey:@"sender"];
它现在有效!正如我所承认的那样 . 只有json对象被复制到一个可变对象 . 对你来说可能很明显,这不是我的意思 .
感谢大家的帮助!
EDIT
最后,在我无法将字典数据中的所有对象更改为可变对象之后,我再次更改了代码 . 我抛出了JSONKit,现在使用NSJSONDeserialization作为推荐,使用选项NSJSONReadingMutableContainers . 我的代码现在看起来像这样,所有容器(数组和字典)也在内部可变 . 这让我高兴! ;-)
NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:myJSON options:NSJSONReadingMutableContainers error:&jsonParsingError];
3 回答
您始终可以通过复制它们的非可变对应项来创建对象的可变版本 .
它不是最佳的,但从性能的角度来看,复制较小的词典通常并不明显 .
声明变量的类型没有任何意义 . 您可以将
json
声明为NSNumber
,这不会使其成为NSNumber
.您需要制作字典的可变副本(使用
mutableCopy
)才能获得NSMutableDictionary
.我有三个想法 .
创建真实数据模型对象并将其存储在数组中 . 使用JSON字典初始化对象 .
在数组中存储NSMutableDictionary对象 . 将JSON字典传递给
+[NSMutableDictionary dictionaryWithDictionary:]
以初始化NSMutableDictionary . 其他人建议在JSON字典上调用-[NSDictionary mutableCopy]
来做同样的事情 .基于NSDictionary创建一个存储附加数据的类别 .
笔记:
通常,创建表示数据的类被认为是最佳选择,但它也是最多的前期工作 . 基本上,当你试图保持字典的维护时,你正在更多的前期工作中反对更多的维护工作 .
存储可变字典正是您所要求的,但可能有很多工作要找到将JSON字典添加到数组并将其替换为新调用的所有位置 .
为NSDictionary创建一个类别意味着您不需要更改任何当前代码,但它需要维护人员了解您如何增强NSDictionary . 此外,它还有助于将您的更改与原始解析的JSON分开 . 您可以使用关联的对象来存储数据 .