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

Posted

技术标签:

【中文标题】将对象添加到 JSONKit 创建的字典?【英文标题】:Add objects to dictionary created by JSONKit? 【发布时间】:2012-10-16 10:31:28 【问题描述】:

在我的项目中,我必须加载一些 json 文件。我使用 JSONKit 解析它们,并在每次解析后使用

NSMutableDictionary *json = [myJSON objectFromJSONString]; 

我将它们添加到一个数组中,例如:

[self.themeArray addObject:json];

到目前为止,这工作正常。现在我需要在视图之间传递字典。到目前为止也可以,但是我需要向字典 object-> json 添加更多对象。即使我将 json 声明为 NSMutableDictionary,它也不允许我添加对象,因为 JSONKit 解析器似乎创建了非可变字典。

我正在考虑创建一个并排包含 json 字典和我的附加数据的对象,这样我就不必更改 json 字典。我什至可以将其更改为 NSDictionary,因为无需更改它。但这对我来说似乎并不优雅。

您知道如何在不更改 JSONKit 库的情况下解决此问题吗?

提前致谢!

编辑

我只是在将代码更改为后尝试过

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

类似的东西

[[self.theme objectForKey:@"theme"]  setObject:sender forKey:@"sender"];
[[self.theme objectForKey:@"theme"]  setValue:sender forKey:@"sender"];

Xcode 抛出异常:

* 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“* -[JKDictionary setObject:forKey:]: mutating method sent to immutable object”

我认为这是因为上级词典中仍然存在嵌套词典。然后我将不得不通过我的 json 对象进行交互以将所有字典复制到可变字典,对吗?

也许最好按照 Guillaume 的建议切换到 NSJSONSerialization。

编辑

我刚刚尝试过这样的事情

[self.theme  setValue:sender forKey:@"sender"];

现在可以使用了!正如我所认为的那样。只有 json 对象被复制到可变对象。对你来说可能很明显,对我来说不是。

感谢大家的帮助!

编辑

最后,在我无法将字典数据深处的所有对象更改为可变对象后,我再次更改了代码。我扔掉了 JSONKit,现在使用 NSJSONDeserialization 作为推荐,这里有 NSJSONReadingMutableContainers 选项。我的代码现在看起来像这样,所有容器(数组和字典)在内部也是可变的。这让我高兴! ;-)

NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:myJSON options:NSJSONReadingMutableContainers error:&jsonParsingError];

【问题讨论】:

这不是答案,因为您想使用 JSONKit,但如果您改用 Apple 的 NSJSONSerialization(ios 5+),则可以选择获取可变对象。否则,mutableCopy 是要走的路。 【参考方案1】:

您始终可以通过复制对象的非可变副本来创建对象的可变版本。

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

这不是最优的,但是从性能的角度来看,复制较小的字典通常不会引起注意。

【讨论】:

这个的简写是 [[myJSON objectFromJSONString] mutableCopy];不确定,但可能会稍微快一点【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

我有三个想法供你参考。

    创建真实的数据模型对象并将它们存储在您的数组中。使用 JSON 字典初始化您的对象。 将 NSMutableDictionary 对象存储在您的数组中。将 JSON 字典传递给 +[NSMutableDictionary dictionaryWithDictionary:] 以初始化 NSMutableDictionary。其他人建议在 JSON 字典上调用 -[NSDictionary mutableCopy] 来做同样的事情。 基于存储附加数据的 NSDictionary 创建一个类别。

注意事项:

通常,创建类来表示您的数据被认为是最佳选择,但它也是最多的前期工作。基本上,当您试图保持字典的维护时,您需要更多的前期工作与更多的维护工作。

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

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

【讨论】:

以上是关于将对象添加到 JSONKit 创建的字典?的主要内容,如果未能解决你的问题,请参考以下文章

JSONKit:创建一个 json 格式的字符串

JSONKit在从iphone中的Web服务解码JSON对象时更改浮点值

如何使用 AlamofireObjectMapper 将 JSON 字典添加到领域

发送到不可变对象的变异方法

JSONKit(在 RestKit 中)将 JSON 转换为 NSArray

添加嵌套字典会导致 JSONSerialization 返回 nil