【发布时间】:2013-12-24 11:10:53
【问题描述】:
不确定我是否正确命名了这个问题,但这里是:
假设我有一个从 API 返回的 JSON 响应。 JSON 使用 SBJson 解析,完美无瑕。 JSON 示例:
{
"value": 15199, //this field is required
"value_str": "$1.5k", //this field is required
"change": 33 //this field is optional
}
现在这会被解析成一个简洁的小NSDictionary,我可以从中读取。到目前为止,我是这样的:
//lets assume that "dict" is the parsed JSON using SBJSON
NSDictionary *number = @{@"value_str": [dict objectForKey:@"value_str"]}; //this works
number = @{@"value_str": [dict objectForKey:@"value_str"], @"change": [dict objectForKey:@"change"]}; //this crashes if there was no "change" in JSON
所以发生崩溃是因为我试图将 nil 值设置为 NSDictionary 的对象,这是不允许的。如果change 字段始终存在,这将起作用。如何解决这个问题?
我真的必须这样做吗:
NSDictionary *number = [NSDictionary dictionary];
[number setValue:[dict objectForKey:@"value_str"] forKey:@"value_str"];
[number setValue:[dict objectForKey:@"change"] forKey:@"change"];
对于字典中的每个键值对等等?这样写起来更慢更痛苦。必须有更好的方法,对吧?请? :)
哦,如果我设置setValue ForKey,然后像objectForKey 这样查询,我会得到我用setValue ForKey 设置的对象(或值)吗?
编辑:我有一个想法,但我不确定如何有效地实施它。而不是在这里检查每个键等等为什么不继承NSDictionary 并覆盖@{} 构造函数,我认为它是dictionaryWithObjectsAndKeys。我熟悉编译器va_lists,但我没有足够的知识来有效地实现这样的构造函数。如果有人会这样做,那就太棒了。
整个想法是检查该构造方法中的值,如果对象是nil,则跳过它。怎么样?有人可以让它打勾还是一个坏主意?
EDIT2:发现子类化是一个坏主意:) 使用了 cmets 中提供的解决方案。
【问题讨论】:
-
为什么不写一个foreach循环来迭代json中所有key的值?
-
因为可以说我并不总是需要“值”,而且如果字典有 100 个条目,那将是非常低效的。
-
我认为您需要检查每次是否存在关键“更改”。如果是,则提取该键值,否则不提取它。我现在只能看到这种方式。
-
将对象从一本字典转录到另一本有什么意义?为什么不复制字典,或者使用相同的字典对象?
-
+1 回答这个问题。我见过的最好的解决方法是
@{@"key": keyValue ? : [NSNull null]}。这将添加keyValue,如果不是nil,或者null,如果nil。
标签: ios objective-c json nsarray nsdictionary