首页 文章

将对象添加到JSONKit创建的字典中?

提问于
浏览
1

在我的项目中,我必须加载一些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 回答

  • 1

    您始终可以通过复制它们的非可变对应项来创建对象的可变版本 .

    NSMutableDictionary* json = [[myJSON objectFromJSONString] mutableCopy];
    

    它不是最佳的,但从性能的角度来看,复制较小的词典通常并不明显 .

  • 2

    即使我将json声明为NSMutableDictionary它也不允许我添加对象,因为JSONKit解析器似乎创建了不可变的字典 .

    声明变量的类型没有任何意义 . 您可以将 json 声明为 NSNumber ,这不会使其成为 NSNumber .

    您需要制作字典的可变副本(使用 mutableCopy )才能获得 NSMutableDictionary .

  • 1

    我有三个想法 .

    • 创建真实数据模型对象并将其存储在数组中 . 使用JSON字典初始化对象 .

    • 在数组中存储NSMutableDictionary对象 . 将JSON字典传递给 +[NSMutableDictionary dictionaryWithDictionary:] 以初始化NSMutableDictionary . 其他人建议在JSON字典上调用 -[NSDictionary mutableCopy] 来做同样的事情 .

    • 基于NSDictionary创建一个存储附加数据的类别 .

    笔记:

    通常,创建表示数据的类被认为是最佳选择,但它也是最多的前期工作 . 基本上,当你试图保持字典的维护时,你正在更多的前期工作中反对更多的维护工作 .

    存储可变字典正是您所要求的,但可能有很多工作要找到将JSON字典添加到数组并将其替换为新调用的所有位置 .

    为NSDictionary创建一个类别意味着您不需要更改任何当前代码,但它需要维护人员了解您如何增强NSDictionary . 此外,它还有助于将您的更改与原始解析的JSON分开 . 您可以使用关联的对象来存储数据 .

相关问题